参考文献:https://www.devbean.net/2012/09/qt-study-road-2-dialogs-intro/
对话框通常会是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。尽管 Ribbon 界面的出现在一定程度上减少了对话框的使用几率。
Qt 中使用QDialog类实现对话框。就像主窗口一样,通常会设计一个类继承QDialog。
QDialog(及其子类,以及所有Qt::Dialog类型的类)的对于其 parent 指针都有额外的解释:如果 parent 为 NULL,则该对话框会作为一个顶层窗口,否则则作为其父组件的子对话框(此时,其默认出现的位置是 parent 的中心)。
顶层窗口与非顶层窗口的区别在于,顶层窗口在任务栏会有自己的位置,而非顶层窗口则会共享其父组件的位置。
Qt 支持模态对话框和非模态对话框。其中,Qt 有两种级别的模态对话框:应用程序级别的模态和窗口级别的模态,默认是应用程序级别的模态。
应用程序级别的模态是指,当该种模态的对话框出现时,用户必须首先对对话框进行交互,直到关闭对话框,然后才能访问程序中其他的窗口。
窗口级别的模态是指,该模态仅仅阻塞与对话框关联的窗口,但是依然允许用户与程序中其它窗口交互。
使用QDialog::open()实现窗口级别的模态对话框,
使用QDialog::exec()实现应用程序级别的模态对话框,
使用QDialog::show()实现非模态对话框。
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QToolBar>
#include <QtWidgets/QSpinBox>
#include <QtWidgets/QLayout>
#include "mywindow.h"
MyWindow::MyWindow(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
setWindowTitle(tr("Main Window")); //设置主窗口的标题
openAction = new QAction(QIcon("C:/Users/Administrator/Desktop/MyWindow/MyWindow/images/doc-open"), tr("&Open..."), this);
openAction->setShortcuts(QKeySequence::Open);
openAction->setStatusTip(tr("Open an existing file")); //setStatusTip()则实现了当用户鼠标滑过这个 action 时,会在主窗口下方的状态栏显示相应的提示。
connect(openAction, &QAction::triggered, this, &MyWindow::open);
QMenu *file = menuBar()->addMenu(tr("&File"));
file->addAction(openAction);
QToolBar *toolBar = addToolBar(tr("&File"));
toolBar->addAction(openAction);
statusBar(); //状态栏
}
MyWindow::~MyWindow()
{
}
void MyWindow::open()
{
在栈上创建
QMessageBox::information(this, tr("Information"), tr("Open"));
//QDialog dialog();由于我们没有设置对话框的 parent 指针,会看到在任务栏出现了对话框的位置
//QDialog dialog(this);设置对话框的 parent 指针,会看到在任务栏没有了对话框的位置
//dialog.setWindowTitle(tr("Hello, dialog!"));
dialog.exec(); //模态
//dialog.show(); //非模态 一闪而过
在堆上创建 非模态
//QDialog *dialog = new QDialog;
//dialog->setAttribute(Qt::WA_DeleteOnClose); //setAttribute()函数设置对话框关闭时,自动销毁非模态对话框。
//dialog->setWindowTitle(tr("Hello, dialog!"));
//dialog->show();
//在堆上创建 模态
QDialog *dialog = new QDialog;
dialog->deleteLater(); //销毁模态对话窗
dialog->setWindowTitle(tr("Hello, dialog!"));
dialog->exec();
}