• 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 之模式、非模式、半模式对话框


  • 相关阅读:
    Delphi 消息窗口 Application.messagebox
    delphi绑定ComboBox数据
    delphi ComboBox AddObject 组合框下拉取值正确使用方法
    属性分类及其实现
    Delphi 在dbgrideh中表格输入数据时有效性的检查(转)
    XE下显示托盘图标(TrayIcon)
    delphi trayIcon控件,如何实现窗口最小化的时候到系统托盘?
    一步步开发自己的博客 番外篇(7、异步记录日志 和 文章阅读量统计)
    一步步开发自己的博客 .NET版 剧终篇(6、响应式布局 和 自定义样式)
    一步步开发自己的博客 .NET版(5、Lucenne.Net 和 必应站内搜索)
  • 原文地址:https://www.cnblogs.com/linuxAndMcu/p/11546208.html
Copyright © 2020-2023  润新知