QT的对话框分为二种:
1,模态对话框,当该类型对话框显示的时候阻塞当前除了该窗口外其他窗口,也就是说只有该对话框上面的操作完成我们才能接着执行其他操作.
2,非模态对话框,对其他窗口没有任何影响。
模态对话框又分为二种:
1,窗口级别的模态对话框,该窗口弹出该对话框的时候不影响其他窗口,只影响打开该对话框的窗口.
2,应用程序级别的模态对话框.
Qt使用 QDialog::exec()实现应用程序级别的对话框;
使用QDialog::open()实现窗口级别的对话框;
使用QDialog::show()实现非模态对话框.
在我们来看代码之前我们首先要知道的是:当一个窗口关闭的时候位于该窗口中的部件都会被删除掉,也就是说根据C++的标准父窗口销毁的时候,所有位于该父窗口中的部件的析构函数应该先于父窗口被调用。
比如class BaseWindow 和 class MainWindow : public MainWindow; 在MainWindow的析构函数调用之前BaseWindow的析构函数应该被首先调用,然后才是MainWindow的析构函数别调用。
如果MainWindow中含有ToolBar,MenuBar之类的那么很明显肯定是ToolBar,MenuBar之类的析构函数先被调用咯.
//MainWindow.h
#include <QMainWindow>
#include <memory>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void openDialog();
private:
std::shared_ptr<QDialog> dialog;
std::shared_ptr<QAction> action;
std::shared_ptr<QMenu> menu;
};
//MainWindow.cpp
#include <QDialog> #include <QAction> #include <QMenu> #include <QMenuBar>
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { this->setWindowTitle(QString("My Window"));
this->action = std::shared_ptr<QAction>(new QAction(tr("open dialog"), this));
connect(action.get(), &QAction::triggered, this, &MainWindow::openDialog);
this->menu = std::shared_ptr<QMenu>(menuBar()->addMenu(tr("open..."))); (this->menu)->addAction(action.get());
}
MainWindow::~MainWindow() {
}
void MainWindow::openDialog() { this->dialog = std::shared_ptr<QDialog>(new QDialog); this->setWindowTitle(tr("Dialog")); (this->dialog)->open(); }
如果上面的openDialog()写成下面这样:
void MainWindow::openDialog() { QDialog dialog; dialog.show(); // exec(), open(); }
如果照着上面那么些对话框就会一闪而过为什么呢? 因为当openDialog执行完毕的时候QDialog的析构函数被调用.
当然你可能会想写成这样怎么样:
void MainWindow::openDialog() { QDialog* dialog = new QDialog; dialog->show(); //exec(), open(); }
但是如果这样的话不就内存泄漏了么!!!!!!!!!