Как правильно организовать открытие окон по кнопкам? (создание и размещение указателей)
Допустим, у меня имеется окно main, в котором присутствует 10 кнопок, которые открывают 10 разных окон. Например вот одна кнопка :
QAction *actionSelectZap = ui->menuBar->addAction(tr("Выбор записи"));
connect(actionSelectZap,SIGNAL(triggered()),this,SLOT(slotOpenFormChoice()));
Как правильно организовать это открытие? в каких местах создавать указатели? И как в идеале должна выглядеть функция-обработчик? (описание слота?)
Добавлено: Хочу уточнить, что я, например, могу в обработчике сделать вот так:
FormChoice* formchoice= new FormChoice;
formchoice->setAttribute(Qt::WA_DeleteOnClose, true);
formchoice->show();
И это работает, но мне хочется узнать реально крутые и правильные метода создания такого функционала. Чтобы, например использовались умные указатели а не то, что я предложил.
mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <memory>
#include "formchoice.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
FormChoice formchoice;
};
#endif // MAINWINDOW_H
mainwindow.cpp:
#include "mainwindow.h"
#include "formchoice.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setWindowTitle("Observer_demo");
ui->menuBar->addAction(tr("Выбор записи"), [&]() {
formchoice.exec();
});
}
MainWindow::~MainWindow()
{
delete ui;
}
formchoice.h:
#ifndef FORMCHOICE_H
#define FORMCHOICE_H
#include <QDialog>
namespace Ui {
class FormChoice;
}
class FormChoice : public QDialog
{
Q_OBJECT
public:
explicit FormChoice(QDialog*parent = 0);
~FormChoice();
private:
Ui::FormChoice *ui;
};
#endif // FORMCHOICE_H
formchoice.cpp:
#include "formchoice.h"
#include "ui_formchoice.h"
#include <memory>
FormChoice::FormChoice(QDialog*parent) :
QDialog(parent),
ui(new Ui::FormChoice)
{
ui->setupUi(this);
this->setWindowTitle("Выбор записи");
}
FormChoice::~FormChoice()
{
delete ui;
}
main.cpp:
#include "mainwindow.h"
#include "formchoice.h"
#include <QApplication>
int main(int argc, char *argv[])
{
qputenv("QT_AUTO_SCREEN_SCALE_FACTOR", "1");
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
Ответы (1 шт):
Эм, вариантов много и я не уверен, что есть какой-то эталон (на самом деле его нет). Но, попробуйте, для начала, например, уйти от макросов SIGNAL SLOT к лямбда-функциям (С++11).
Для примера возьмем конструктор главного окна (используем вот этот метод addAction):
MainWindow() {
ui->menuBar->addAction(tr("Выбор записи"), this, [&]() {
FormChoice* formchoice= new FormChoice;
// Можно перенести этот атрибут в конструктор окна
formchoice->setAttribute(Qt::WA_DeleteOnClose, true);
formchoice->show();
});
...
ui->menuBar->addAction(tr("Выбор записи 10"), this, [&]() {
FormChoice_10* formchoice= new FormChoice_10;
formchoice->setAttribute(Qt::WA_DeleteOnClose, true);
formchoice->show();
});
}
В этом варианте вам не надо плодить слоты, все реализуется в лямбдах. Умные указатели тут тоже не нужны, потому что ваши окна уничтожаются после закрытия (Qt::WA_DeleteOnClose)
Часто окна нужны в модальном режиме и поэтому:
ui->menuBar->addAction(tr("Выбор записи"), [&]() {
FormChoice formchoice;
formchoice.exec();
});
Объект окна (либо наследник QDialog, или имеющий метод exec() с QEventLoop в нем) удалится после завершения работы лямбда-функции