Qt 模态 非模态的使用

Qt 模态 非模态的使用

在Qt中,模态(modal)和非模态(modeless)对话框之间有几个重要区别:

  1. 模态对话框:

    • 模态对话框会阻止用户与其它应用程序窗口进行交互,直到对话框被关闭为止,但是并不影响 父界面的数据展示 以及业务执行。(在模态情况下,父界面的业务流程不会完全被阻塞,但事件处理和用户交互可能会受到暂时的影响,直到模态对话框关闭。)
    • 当用户与模态对话框进行交互时,程序的其余部分会被阻塞,用户无法访问主窗口或其它对话框。
    • 模态对话框通常用于需要用户立即响应的情况,例如需要用户做出确认或提供信息。
  2. 非模态对话框:

    • 非模态对话框允许用户在打开的同时继续与应用程序的其余部分进行交互。
    • 用户可以同时操作主窗口和非模态对话框,而无需等待对话框关闭。
    • 非模态对话框通常用于允许用户在进行其他操作时访问辅助功能或提供额外信息。

在Qt中,可以使用QDialog类创建模态或非模态对话框。要创建模态对话框,可以使用exec()方法,而要创建非模态对话框,则可以使用show()方法。

代码使用:

复制代码
代码是结合项目制作蒙版使用(代码不一定百分之百直接使用), 结合自己使用场景使用修改

QWidget的模态使用:

两种使用方法:
  • setWindowModality(Qt::ApplicationModal);
  • setAttribute(Qt::WA_ShowModal, true);
cpp 复制代码
#include <QApplication>
#include<QDialog>
#include<QDebug>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget *pWidget = new QWidget();
    pWidget->setWindowTitle(QStringLiteral("主界面"));
    pWidget->show();

    QWidget *sWidget = new QWidget(pWidget);    //导航栏子只有一个图标
    sWidget->setWindowTitle(QStringLiteral("子界面"));
    sWidget->setFixedSize(QSize(300,300));

    sWidget->setWindowFlags(Qt::FramelessWindowHint|Qt::Dialog);
    sWidget->setWindowOpacity(0.4);
    sWidget->setWindowModality(Qt::ApplicationModal);
    sWidget->show();

    return a.exec();
}
cpp 复制代码
#include <QApplication>
#include<QDialog>
#include<QDebug>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget *pWidget = new QWidget();
    pWidget->setWindowTitle(QStringLiteral("主界面"));
    pWidget->show();

    QWidget *sWidget = new QWidget(pWidget);    //导航栏子只有一个图标
    sWidget->setWindowTitle(QStringLiteral("子界面"));
    sWidget->setFixedSize(QSize(300,300));

    sWidget->setWindowFlags(Qt::FramelessWindowHint|Qt::Dialog);
    sWidget->setWindowOpacity(0.4);
    sWidget->setAttribute(Qt::WA_ShowModal, true);
    sWidget->show();

    return a.exec();
}

QDialog的使用:

非模态:
cpp 复制代码
#include <QApplication>
#include<QDialog>
#include<QDebug>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget *pWidget = new QWidget();
    pWidget->setWindowTitle(QStringLiteral("主界面"));
    pWidget->show();

    QDialog *sWidget = new QDialog();
    sWidget->setWindowTitle(QStringLiteral("子界面"));
    sWidget->setFixedSize(QSize(300,300));

    sWidget->setWindowFlags(Qt::FramelessWindowHint|Qt::Dialog);
    sWidget->setWindowOpacity(0.4);

    sWidget->show();

    return a.exec();
}
模态:
cpp 复制代码
#include <QApplication>
#include<QDialog>
#include<QDebug>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget *pWidget = new QWidget();
    pWidget->setWindowTitle(QStringLiteral("主界面"));
    pWidget->show();

    QDialog *sWidget = new QDialog();
    sWidget->setWindowTitle(QStringLiteral("子界面"));
    sWidget->setFixedSize(QSize(300,300));

    sWidget->setWindowFlags(Qt::FramelessWindowHint|Qt::Dialog);
    sWidget->setWindowOpacity(0.4);
    sWidget->exec();
    // 或者
    // sWidget->setModal(true);
    // sWidget->show();

    return a.exec();
}
相关推荐
奇树谦1 小时前
Qt Quick 图片加载与 GPU 纹理机制详解:QImage、QQuickTextureFactory、QSGTexture 与异步加载
开发语言·qt·系统架构
宝桥南山1 小时前
.NET 11 - 尝试一下Blazor中的新特性SupplyParameterFromTempData
microsoft·微软·c#·asp.net·.net·.netcore
BroNekoX1 天前
我将基于 QtQuick 框架开发的音乐播放器性能做到顶级
qt
Liangwei Lin1 天前
Exchange Server 2019 部署手册
microsoft
小小晓.1 天前
Qt 对话框、QLineEdit 与布局管理实战详解
开发语言·qt
ms365copilot2 天前
Microsoft 365 Copilot跨工作资料整理
microsoft·copilot
中二骚年2 天前
Windows 安全中心 / 防火墙故障,calc和Microsoft Store,终端(管理员)无法正常打开。 原因 + 修复方案
windows·安全·microsoft
扶尔魔ocy2 天前
【QT入门到晋级】用开源的自定义控件开发
c++·qt·自定义控件
lhbweilai2 天前
QT项目(串口助手)
开发语言·qt
kk_net88992 天前
微软常用运行库合集免费下载安装教程(附运行库安装包)微软运行库安装图文教程
其他·microsoft