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();
}
相关推荐
wangjialelele9 小时前
Qt中的常用组件:QWidget篇
开发语言·前端·c++·qt
不坑老师9 小时前
利用不坑盒子在WPS中插入网页,放映的电脑无需安装插件,直接就能显示网页!
microsoft·word·powerpoint·wps
寒秋丶10 小时前
AutoGen多智能体协作、人机交互与终止条件
人工智能·python·microsoft·ai·人机交互·ai编程·ai写作
春蕾夏荷_72829772515 小时前
qcustomplot 显示坐标轴
qt·qcustomplot·坐标轴
郝学胜-神的一滴15 小时前
Qt删除布局与布局切换技术详解
开发语言·数据库·c++·qt·程序人生·系统架构
yy_xzz18 小时前
Debian 系统中 Qt Creator 用 sudo 启动后权限问题
c++·qt
wwlsm_zql20 小时前
石头科技专利创新:清洁机器人维护简化,效率升级
人工智能·科技·microsoft·机器人
夏玉林的学习之路1 天前
正则表达式
数据库·c++·qt·mysql·正则表达式
wwlsm_zql1 天前
微软Copilot+企业版亮相:GPT-5赋能,效率激增47%,多模态操控金融级安全
人工智能·gpt·microsoft·copilot
_OP_CHEN1 天前
从零开始的QT开发指南:(一)背景、特性与环境搭建
qt·qt下载·图形化界面·gui框架·qt环境配置·qt sdk配置·qt环境变量配置