您的位置:首页 > 编程语言 > Qt开发

QT5: QDialog.

2016-03-31 00:00 417 查看
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();}
但是如果这样的话不就内存泄漏了么!!!!!!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: