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();
}
相关推荐
爱奥尼欧2 小时前
【Linux 系统】基础IO——Linux中对文件的理解
linux·服务器·microsoft
看到我,请让我去学习3 小时前
Qt编程-qml操作(js,c++,canvas)
开发语言·qt
哈市雪花5 小时前
相机:Camera原理讲解(使用OpenGL+QT开发三维CAD)
qt·3d·交互·相机·图形学·opengl·视角
不惑_5 小时前
动感阴影生成器,一键生成立体效果,提升设计质感
microsoft
marteker5 小时前
微软广告推出新的精细资产级别审核
microsoft
未来智慧谷5 小时前
微软医疗AI诊断系统发布 多智能体协作实现疑难病例分析
人工智能·microsoft·医疗ai
野生技术架构师5 小时前
简述MCP的原理-AI时代的USB接口
人工智能·microsoft
不坑老师6 小时前
利用不坑盒子的Copilot,快速排值班表
microsoft·word·powerpoint·excel·copilot·wps
津津有味道7 小时前
Qt C++串口SerialPort通讯发送指令读写NFC M1卡
linux·c++·qt·串口通信·serial·m1·nfc
feiyangqingyun9 小时前
全网唯一/Qt结合ffmpeg实现手机端采集摄像头推流到rtsp或rtmp/可切换前置后置摄像头/指定分辨率帧率
qt·智能手机·ffmpeg