QT创建模态对话框阻塞整个应用程序和非模态对话框唯一性约束的简单示例

QT创建模态对话框阻塞整个应用程序和非模态对话框唯一性约束的简单示例

部分代码:

    // 创建模态对话框阻塞整个应用程序和非模态对话框唯一性约束
    QMenu *pDialog = mBar->addMenu(QString::fromLocal8Bit("对话框"));
    QAction *pTopDialog = pDialog->addAction(QString::fromLocal8Bit("模态对话框"));
    connect(pTopDialog, &QAction::triggered,
        [this] () mutable {
            QDialog * pdlg1 = nullptr;
            pdlg1 = new QDialog(this);
            pdlg1->setWindowTitle(QString::fromLocal8Bit("模态对话框"));
            pdlg1->setModal(true);
            pdlg1->setAttribute(Qt::WidgetAttribute::WA_DeleteOnClose);
            pdlg1->show();
            qDebug() << QString::fromLocal8Bit("打开模态对话框").toStdString().c_str() << "dialog addr: " << (void *)pdlg1 << (void *)&pdlg1;
        });
    pDialog->addSeparator();
    static QPointer<QDialog> pp = nullptr; // 确保对话框的唯一性的QT智能保护指针
    QAction *pNTopDialog = pDialog->addAction(QString::fromLocal8Bit("非模态对话框"));
    connect(pNTopDialog, &QAction::triggered,
        [this] () mutable {
            QDialog * pdlg2 = nullptr;
            if ( pp.isNull() )
            {
                pdlg2 = new QDialog(this);
                pp = pdlg2; // 保存当前对话框的QObject对象的地址
                pdlg2->setWindowTitle(QString::fromLocal8Bit("非模态对话框"));
                pdlg2->setModal(false);
                pdlg2->setAttribute(Qt::WidgetAttribute::WA_DeleteOnClose);
                pdlg2->show();
                qDebug() << QString::fromLocal8Bit("打开非模态对话框").toStdString().c_str() << "dialog addr: " << (void *)pdlg2 << (void *)&pdlg2;
            }
            else
            {
                pdlg2 = pp.data(); // 获得当前对话框的QObject对象的地址
                qDebug() << QString::fromLocal8Bit("当前对话框已经打开").toStdString().c_str() << "dialog addr: " << (void *)pdlg2 << (void *)&pdlg2;
            }
    });

效果:

控制台输出信息:

QWindowsWindow::setGeometryDp: Unable to set geometry 100x30+481+302 on QWidgetWindow/‘QDialogClassWindow‘. Resulting geometry:  116x30+481+302 (frame: 8, 30, 8, 8, custom margin: 0, 0, 0, 0, minimum size: 0x0, maximum size: 16777215x16777215).
QWindowsWindow::setGeometryDp: Unable to set geometry 100x30+481+302 on QWidgetWindow/‘QDialogClassWindow‘. Resulting geometry:  116x30+481+302 (frame: 8, 30, 8, 8, custom margin: 0, 0, 0, 0, minimum size: 0x0, maximum size: 16777215x16777215).
打开模态对话框 dialog addr:  0x4b78b0 0x22c298
QWindowsWindow::setGeometryDp: Unable to set geometry 100x30+782+289 on QWidgetWindow/‘QDialogClassWindow‘. Resulting geometry:  116x30+782+289 (frame: 8, 30, 8, 8, custom margin: 0, 0, 0, 0, minimum size: 0x0, maximum size: 16777215x16777215).
QWindowsWindow::setGeometryDp: Unable to set geometry 100x30+782+289 on QWidgetWindow/‘QDialogClassWindow‘. Resulting geometry:  116x30+782+289 (frame: 8, 30, 8, 8, custom margin: 0, 0, 0, 0, minimum size: 0x0, maximum size: 16777215x16777215).
打开非模态对话框 dialog addr:  0x415ea8 0x22c27c
当前对话框已经打开 dialog addr:  0x415ea8 0x22c27c
当前对话框已经打开 dialog addr:  0x415ea8 0x22c27c
QWindowsWindow::setGeometryDp: Unable to set geometry 100x30+782+289 on QWidgetWindow/‘QDialogClassWindow‘. Resulting geometry:  116x30+782+289 (frame: 8, 30, 8, 8, custom margin: 0, 0, 0, 0, minimum size: 0x0, maximum size: 16777215x16777215).
QWindowsWindow::setGeometryDp: Unable to set geometry 100x30+782+289 on QWidgetWindow/‘QDialogClassWindow‘. Resulting geometry:  116x30+782+289 (frame: 8, 30, 8, 8, custom margin: 0, 0, 0, 0, minimum size: 0x0, maximum size: 16777215x16777215).
打开非模态对话框 dialog addr:  0x4847f0 0x22c27c
当前对话框已经打开 dialog addr:  0x4847f0 0x22c27c
当前对话框已经打开 dialog addr:  0x4847f0 0x22c27c
时间: 2024-10-23 05:02:11

QT创建模态对话框阻塞整个应用程序和非模态对话框唯一性约束的简单示例的相关文章

QT模态对话框及非模态对话框

QT模态对话框及非模态对话框 模态对话框(Modal Dialog)与非模态对话框(Modeless Dialog)的概念不是Qt所独有的,在各种不同的平台下都存在.又有叫法是称为模式对话框,无模式对话框等.所谓模态对话框就是在其没有被关闭之前,用户不能与同一个应用程序的其他窗口进行交互,直到该对话框关闭.对于非模态对话框,当被打开时,用户既可选择和该对话框进行交互,也可以选择同应用程序的其他窗口交互. 在Qt中,显示一个对话框一般有两种方式,一种是使用exec()方法,它总是以模态来显示对话框

QT笔记之模态对话框及非模态对话框

模态对话框(Modal Dialog)与非模态对话框(Modeless Dialog)的概念不是Qt所独有的,在各种不同的平台下都存在.又有叫法是称为模式对话框,无模式对话框等.所谓模态对话框就是在其没有被关闭之前,用户不能与同一个应用程序的其他窗口进行交互,直到该对话框关闭.对于非模态对话框,当被打开时,用户既可选择和该对话框进行交互,也可以选择同应用程序的其他窗口交互. 在Qt中,显示一个对话框一般有两种方式,一种是使用exec()方法,它总是以模态来显示对话框:另一种是使用show()方法

VS2010/MFC对话框:非模态对话框的创建及显示

非模态对话框的创建及显示 上一节讲了模态对话框及其弹出过程,本节接着讲另一种对话框--非模态对话框的创建及显示. 已经说过,非模态对话框显示后,程序其他窗口仍能正常运行,可以响应用户输入,还可以相互切换.鸡啄米会将上一讲中创建的Tip模态对话框改为非模态对话框,让大家看下效果. 非模态对话框的对话框资源和对话框类 实际上,模态对话框和非模态对话框在创建对话框资源和生成对话框类上是没有区别的,所以上一讲中创建的IDD_TIP_DIALOG对话框资源和CTipDlg类都不需要修改. 创建及显示非模态

MFC中模态对话框和非模态对话框

MFC的对话框非为两种,一种叫模态对话框(Modal  Dialog  Box,又叫做模式对话框),一种叫做非模式对话框(Modaless Dialog Box,又叫无模式对话框).两者的区别在于当对话框打开的时候,是否允许用户进行其他对象的操作. 一.模态对话框 模态对话框指,当用户需要对该对话框之外的其他对话框或者模块进行操作时,必须该对话框关闭,才能去编辑其他对话框或者模块. 创建如下: //创建模态对话框 CModalDialog modalDialog; modalDialog.DoM

MFC模态与非模态对话框

1.简述 1.1模态对话框(model dialog box) 当模态对话框显示时,程序会暂停执行,直到关闭这个模态对话框之后,才能执行程序中的其他任务. 1.2非模态对话框(modeless dialog box) 当非模态对话框显示时,运行转而执行程序中的其他任务,而不用关闭这个对话框. 2.代码 2.1模态对话框的实现 void CModelCtrDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 TestDialog1 dlg; dlg

MFC单文档下使用非模态对话框

由于自己写的程序是自动获取桌面实时图像,所以用模态对话框导致程序出错,目前粗鄙的理解是模态对话框会让对话框所在线程暂停,当关闭对话框后才能继续操作,而非模态对话框可以不必让程序暂停. 下面记录非模态对话框的创建过程: 1 在单文档中新建一个对话框资源并生成对话框类 CRadiusDlg 2 在视图类C**view.cpp中添加对话框的头文件,并添加一个对话框类的指针变量CRadiusDlg *pModalessDlg; 3 在菜单栏添加一个用于显示对话框的菜单项,并在响应事件处,添加事件处理代码

【转】MFC模态对话框和非模态对话框

MFC中对话框有两种形式,一个是模态对话框(model dialog box),一个是非模态对话框(modeless dialog box). 一.模态对话框(model dialog box) 在程序运行的过程中,若出现了模态对话框,那么主窗口将无法发送消息,直到模态对话框退出才可以发送. 点击模态对话框中的OK按钮,模态对话框会被销毁. 创建一个模态对话框的代码: 1 //创建一个模态对话框 2 CTestDialog td; 3 td.DoModal(); 其中CTestDialog为我自

MFC 非模态对话框

MFC中对话框有两种形式,一个是模态对话框(model dialog box),一个是非模态对话框(modeless dialog box). 一.模态对话框(model dialog box) 在程序运行的过程中,若出现了模态对话框,那么主窗口将无法发送消息,直到模态对话框退出才可以发送. 点击模态对话框中的OK按钮,模态对话框会被销毁. 创建一个模态对话框的代码: [cpp] view plaincopy //创建一个模态对话框 CTestDialog td; td.DoModal(); 其

模态与非模态对话框

一般来说,Windows应用程序中,对话框分为模态对话框和非模态对话框两种.二者的区别在于当对话框打开时,是否允许用户进行其他对象的操作.模态对话框垄断了用户的输入.当一个模态对话框打开时,用户只能与该对话框进行交互,而其他用户界面对象收不到输入信息.模态对话框下,用户需要操作目标对话框就必须先操作模态对话框. 非模态对话框(Nonmodal Dialogue Box,又叫做无模式对话框),与模态对话框不同,当用户打开非模态对话框时,依然可以操作其他窗口.