2.4 对话框QDialog

简介: 2.4 对话框QDialog

QDialog类是对话窗口的基类。

对话窗口是一个顶层窗口,主要用于与用户进行简短交互,如果设置了父窗口,其显示的位置会在父窗口的中心。

2.4.1 模态对话框

模态对话框可以在相同的应用程序中阻止对其他可见窗口的输入。

当应用程序的模态对话框打开时,用户必须完成与对话框的交互,并在访问应用程序的任何其他窗口之前关闭它。

2.4.1.1 模态对话框的两种方式

  • 窗口模态对话框:只能阻止与对话框关联(它的父窗口、所有祖父窗口,以及父窗口和父窗口的所有兄弟姐妹)的窗口的访问,允许用户在应用程序中继续使用其他窗口。
  • 应用模态对话框:阻止应用程序的所有窗口输入。

2.4.1.2 显示模态对话框

  • 调用它的exec()函数。当用户关闭对话框时,exec()将提供一个有用的返回值。通常,为了使对话框关闭后并返回适当的值,我们可以连接一个默认按钮,例如:OK按钮关联到accept()槽,Cancle按钮关联到reject()槽。或者可以调用done()槽,返回一个整数值。而根据这个返回值,我们就可以采取下一步动作了。
  • 调用setModal(true)或setWindowModality(),然后show()。与exec()不同,show()弹出对话框后,不需等待用户输入确认,便立即将控制权返回给调用者。

2.4.2 非模态对话框

非模态对话框是独立于同一应用程序中的其他窗口运行的对话框。在文字处理器中查找并替换对话框就是典型的非模态对话框。

非模态对话框使用show()显示,它立即将控制权返回给调用者。

如果在隐藏对话框后再调用show()函数,对话框将显示在原来的位置。

2.4.3 模态对话框示例

新建GUI项目ModelWidget,类名ModelWidget,基类选择QWidget。

在生成的ui文件中添加如下控件

01ebd755782e4c909dad0843d3544acf.jpeg

main.cpp

#include <QDebug>
#include <QApplication>
#include <QDialog>
#include "modelwidget.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    ModelWidget w;
    w.show();
    //非模态对话框
    QDialog modelLessDlg;
    modelLessDlg.setWindowTitle("非模态对话框");
    modelLessDlg.show();
    modelLessDlg.resize(200, 100);
    qDebug() << "显示完非模态对话框后,不需要等用户操作就会立马执行我";
    return a.exec();
}

modelwidget.h

class ModelWidget : public QWidget
{
    Q_OBJECT
public:
    explicit ModelWidget(QWidget *parent = 0);
    ~ModelWidget();
private slots:
    void on_btnWindow_clicked();
    void on_btnApp_clicked();
    void on_btnCustom_clicked();
private:
    Ui::ModelWidget *ui;
};

modelwidget.cpp

#include <QDebug>
#include <QDialog>
#include "modelwidget.h"
#include "ui_modelwidget.h"
#include "customdialog.h"
ModelWidget::ModelWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ModelWidget)
{
    ui->setupUi(this);
}
ModelWidget::~ModelWidget()
{
    delete ui;
}
//弹出窗口模态对话框
void ModelWidget::on_btnWindow_clicked()
{
    QDialog* dlg = new QDialog(this);
    dlg->setAttribute(Qt::WA_DeleteOnClose);//设置对话框关闭后,自动销毁
    dlg->setWindowModality(Qt::WindowModal);
    dlg->show();
    qDebug() << "虽然显示模态对话框,但我不需要等用户操作完就会立马执行";
}
//弹出应用模态对话框
void ModelWidget::on_btnApp_clicked()
{
    QDialog* dlg = new QDialog(this);
    dlg->setAttribute(Qt::WA_DeleteOnClose);//设置对话框关闭后,自动销毁
    dlg->setWindowModality(Qt::ApplicationModal);//或者可以使用setModel(true)
    dlg->show();
    qDebug() << "虽然显示模态对话框,但我也不需要等用户操作完就会立马执行";
}
//自定义对话框
void ModelWidget::on_btnCustom_clicked()
{
    CustomDialog* dlg = new CustomDialog(this);
    dlg->setAttribute(Qt::WA_DeleteOnClose);//设置对话框关闭后,自动销毁
    int ret = dlg->exec();
    if (ret == QDialog::Accepted)
    {
        ui->lineEdit->setText("你点击了OK按钮");
    }
    else if (ret == QDialog::Rejected)
    {
        ui->lineEdit->setText("你点击了Cancle按钮");
    }
}

再添加一个自定义对话框类CustomDialog

右键点击项目=》添加新文件=》QT=》Qt设计师界面类=》Dialog without buttons=》下一步=》类名CustomDialog=》完成

在ui界面,拖入两个按钮,点击编辑信号槽按钮(快捷键F4),如下图

01ebd755782e4c909dad0843d3544acf.jpeg

鼠标点击按钮,按钮变红,拖动鼠标到ui界面上,并弹出信号槽编辑对话框,选择信号clicked和槽accept,同理,编辑Cancel按钮,最后变成下图的样子。可以点击信号槽编辑按钮左侧的编辑窗口按钮(F3键),回到编辑窗口模式。

01ebd755782e4c909dad0843d3544acf.jpeg

customdialog.h

#ifndef CUSTOMDIALOG_H
#define CUSTOMDIALOG_H
#include <QDialog>
namespace Ui {
class CustomDialog;
}
class CustomDialog : public QDialog
{
    Q_OBJECT
public:
    explicit CustomDialog(QWidget *parent = 0);
    ~CustomDialog();
private:
    Ui::CustomDialog *ui;
};
#endif // CUSTOMDIALOG_H

customdialog.cpp

#include "customdialog.h"
#include "ui_customdialog.h"
CustomDialog::CustomDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::CustomDialog)
{
    ui->setupUi(this);
}
CustomDialog::~CustomDialog()
{
    delete ui;
}


编译并运行程序。

1.点击弹出窗口模态对话框,那么你无法点击它的父窗口,但可以点击非模态对话框。

2.关闭窗口模态对话框,那么其他窗口就都可以点击了。

3.打开应用模态对话框,那么所有的其他窗口都无法再点击。

4.关闭应用模态对话框,打开自定义对话框,分别点击OK,Cancle和关闭按钮,查看LineEdit的内容。

好的,关于模态对话框的内容我们就讲到这里,如果你想第一时间看到小豆君的技术分享,就赶快关注吧。

欢迎关注小豆君的微信公众号:小豆君,只要关注,便可加入小豆君为大家创建的C++\Qt交流群,方便讨论学习。

相关文章
|
7月前
|
JavaScript 前端开发
uViw Dialog 对话框
uViw Dialog 对话框
127 0
|
6月前
Qt之对话框
Qt之对话框
|
4月前
|
搜索推荐 C++
【Qt 学习笔记】Qt窗口 | 对话框 | 创建自定义对话框
【Qt 学习笔记】Qt窗口 | 对话框 | 创建自定义对话框
159 4
|
4月前
【Qt 学习笔记】Qt窗口 | 标准对话框 | 文件对话框QFileDialog
【Qt 学习笔记】Qt窗口 | 标准对话框 | 文件对话框QFileDialog
885 4
Qt (QFileDialog&QColorDialog&QFontDialog) 对话框实战
Qt (QFileDialog&QColorDialog&QFontDialog) 对话框实战
Qt (QFileDialog&QColorDialog&QFontDialog) 对话框实战
15 QT - 对话框QDialog概述
15 QT - 对话框QDialog概述
55 0
QT5基本对话框
QFileDialog类的几个静态函数见上表,用户通过这些函数可以很方便地定制 自己的文件对话框。其中,getOpenFileName()函数返回用户选择的文件名。但是当 用户在选择文件时,如果选择“取消”(Cancel),则返回一个空串。在此仅详细说 明getOpenFileName()静态函数中各个参数的作用,其他文件对话框类中相关的静态函数 的参数有与其类似之处。
66 0
QT5基本对话框
|
7月前
|
存储
QT基础入门——QMainWindow与对话框QDialog(三)
QT基础入门——QMainWindow与对话框QDialog(三)
571 0
QT基础入门——QMainWindow与对话框QDialog(三)
|
7月前
[MFC] 对话框自带滚动条的使用
[MFC] 对话框自带滚动条的使用
177 0
|
Linux C++ iOS开发
Qt 5——对话框QDialog
Qt 5——对话框QDialog
587 0