coding
unsky
deepdim
thought

QT5从入门到放弃:(3)模态与非模特

对话框按照是否可以在运行时可以和其他窗口进行交互可以分为:模态与非模态对话框。

直接看例子:

main.cpp

1
2
3
4
5
6
7
8
9
10
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}

因为我们只在 MainWindow的构造函数中实验,所以只有定义即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QDialog win(this);
win.show();
}
MainWindow::~MainWindow()
{
delete ui;
}

可以看到一个窗口一闪而过。剩下的是w窗口被保留,在函数的构造函数里面我们定义了一个窗口win并且指定了this(w) 为其父,在运行中其一闪而过的只剩下W原因是:他并没有实际的内存空间,在构造函数被调用完之后他就被销毁了,所以我们可以使用指针给他new一个空间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QDialog *win=new QDialog(this);
win->show();
}
MainWindow::~MainWindow()
{
delete ui;
}

这样win窗口就被保留下来。
此外因为上段程序中指定了父窗口,所以在new完之后不需要进行delete其会随父窗口进行销毁。

我们也可以用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QDialog win(this);
win.exec();
}
MainWindow::~MainWindow()
{
delete ui;
}

这样会发现win对话框被显示,但是其父窗口没有被显示。
只有我们关闭了win之后w窗口才会被显示出来。

这种对话框我们称之为模态对话框,而上面的写法被成为非模态对话框。

1
2
3
4
5
定义
模态对话框:即没有关闭该对话框之前不能再于其他窗口进行交互。如新建项目时候,我们只能再这个窗口进行操作,只有关了它才能进行其他的操作。
非模态对话框:可以再运行时候可以与其他窗口自由交互。

可以看到,如果让窗口是非模态的只需使用指针进行new即可,而让窗口是模态的只需调用其exec()属性即可。
当然 我们也可以使用setModal()函数进行声明。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QDialog *win=new QDialog(this);
win->setModal(true);
win->show();
}
MainWindow::~MainWindow()
{
delete ui;
}

这种写法可以将win变为模态的,在运行时候会发现,两个窗口都会出现,但是我们只能对win进行拖拽等操作,只有关闭了win才可以对w进行操作。

原因:
因为在运行完show()之后程序会将控制权交给调用者继续执行,而exec()则是在程序执行完操作之后才交出控制权从而继续执行。

还有和setModal()相似的函数,setWindowModality()它可以通过设置参数来进行模态和模态的控制有:

1
2
Qt::NonModal 非模态
Qt::WindowModal 阻塞所有祖先

坚持原创技术分享,您的支持将鼓励我继续创作!