QT5: QDialog.

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();
 }

但是如果这样的话不就内存泄漏了么!!!!!!!!!

你可能感兴趣的:(QT5: QDialog.)