• Qt对话框之二:模态、非模态、半模态对话框


    一、模态对话框

    模态对话框:阻塞同一应用程序中其它可视窗口输入的对话框。模态对话框有自己的事件循环,用户必须完成这个对话框中的交互操作,并且关闭了它之后才能访问应用程序中的其它任何窗口。

    显示模态对话框最常见的方法是调用其 exec() 函数,当用户关闭对话框,exec() 将提供一个有用的返回值,并且这时流程控制继续从调用 exec() 的地方进行。通常情况下,要获得对话框关闭并返回相应的值,我们连接默认按钮,例如:”确定”按钮连接到 accept() 槽,”取消”按钮连接到 reject() 槽。另外我们也可以连接 done() 槽,传递给它 Accepted 或 Rejected。


    示例代码1:

    MainWindow *pMainWindow = new MainWindow();
    pMainWindow->setWindowTitle(QStringLiteral("主界面"));
    pMainWindow->show();
     
    CustomWindow *pDialog = new CustomWindow(pMainWindow);
    pDialog->setWindowTitle(QStringLiteral("模态对话框"));
     
    // 关键代码
    pDialog->exec();
     
    // 关闭模态对话框以后才会执行下面的代码
    pMainWindow->setWindowTitle(QStringLiteral("主界面-模式对话框"));
    qDebug() << QStringLiteral("关闭模态对话框以后,可以继续向下执行");
    

    示例代码2:

    我们可以通过调用 accept() 或者是 reject() 函数来是使得 exec() 函数结束代码如下:

    //可以在之前的代码的快要结束的额时候调用accept();然后在主函数中
    login *user_login=new login;//login是继承dialog的类
    
    int res = user_login->exec();
    if (res == QDialog::Accepted)
    {
    	delete user_login;
    }
    

    二、非模态对话框

    非模态对话框:和同一个程序中其它窗口操作无关的对话框。在文字处理中的查找和替换对话框通常是非模式的,允许用户同时与应用程序的主窗口和对话框进行交互。调用 show() 来显示非模式对话框,并立即将控制返回给调用者。


    示例代码:

    MainWindow *pMainWindow = new MainWindow();
    pMainWindow->setWindowTitle(QStringLiteral("主界面"));
    pMainWindow->show();
     
    CustomWindow *pDialog = new CustomWindow(pMainWindow);
    pDialog->setWindowTitle(QStringLiteral("非模式对话框"));
     
    // 关键代码
    pDialog->show();
     
    // 下面的代码会立即运行
    pMainWindow->setWindowTitle(QStringLiteral("主界面-非模式对话框"));
    qDebug() << QStringLiteral("立即运行");
    
    • 主界面不会被阻塞,可以进行点击、拖动等任何操作。
    • show() 之后的代码会立即执行。

    三、半模态对话框

    调用 setModal(true) 或者 setWindowModality(),然后 show()。有别于 exec(),show() 立即返回给控制调用者。


    MainWindow *pMainWindow = new MainWindow();
    pMainWindow->setWindowTitle(QStringLiteral("主界面"));
    pMainWindow->show();
     
    CustomWindow *pDialog = new CustomWindow(pMainWindow);
    pDialog->setWindowTitle(QStringLiteral("半模式对话框"));
     
    // 关键代码
    pDialog->setModal(true);
    pDialog->show();
     
    // 下面的代码会立即运行
    pMainWindow->setWindowTitle(QStringLiteral("主界面-半模式对话框"));
    qDebug() << QStringLiteral("立即运行");
    
    • 主界面被阻塞,不能进行点击、拖动等任何操作。
    • show()之后的代码却会立即执行。

    参考:

    Qt 之模式、非模式、半模式对话框


  • 相关阅读:
    (论坛答疑点滴)DataGrid模板列中控件的事件中怎么知道是哪行触发的事件?
    (论坛答疑点滴)怎么后台添加CheckBoxList并且得到选择结果
    (论坛答疑点滴)联合主键的情况怎么在DataGrid中利用DataKeys定位记录?
    (原创)按照一定的格式生成一定数量的随机数的例子
    (原创)DataGrid动态添加模板列的一个例子
    有的时候看似是对的往往是不对的
    (论坛答疑点滴)如何向某网址Post信息,并得到CookieContainer以便以后直接通过验证
    (论坛答疑点滴)怎么触发DataGrid模板列中控件的事件?
    (原创)利用vs.net快速开发windows服务(c#)
    (论坛答疑点滴)怎么给Table动态添加控件并且得到控件的值?
  • 原文地址:https://www.cnblogs.com/linuxAndMcu/p/11546208.html
Copyright © 2020-2023  润新知