当前位置: 首页 > article >正文

模态与非模态的对话框

本文学习自:

《Qt Creato快速入门》

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

1.

#include "widget.h"
#include "ui_widget.h"
#include <QDialog>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    QDialog dialog(this);
    dialog.resize(550,550);
    dialog.setStyleSheet("background-color:green;");
    dialog.show();
}

Widget::~Widget()
{
    delete ui;
}

这样写dialog会一闪而逝的。

因为dialog的生命周期很短,构造函数完成后,它就析构了。

2.

#include "widget.h"
#include "ui_widget.h"
#include <QDialog>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    QDialog *dialog = new QDialog(this);
    dialog->resize(550,550);
    dialog->setStyleSheet("background-color:green;");
    dialog->show();
}

写成这样的话,会显示dialog,但不是模态的。

什么是模态对话框:

在关闭它之前,不能再与同一个应用程序的其他窗口进行交互。

3.

#include "widget.h"
#include "ui_widget.h"
#include <QDialog>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    QDialog dialog(this);
    dialog.resize(550,550);
    dialog.setStyleSheet("background-color:green;");
    dialog.exec();
}

Widget::~Widget()
{
    delete ui;
}

写成这样的话,dialog是模态的。

而且,因为使用了exec()方法,当dialog关闭后,程序才继续向下执行。

exec():当对话框关闭时,函数返回值,程序向下进行。

show():调用完函数后,立即将控制权交给调用者,程序继续向下进行。

4.使用show()也可以建立模态对话框,需要在前面使用setModel()函数。

#include "widget.h"
#include "ui_widget.h"
#include <QDialog>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    QDialog dialog(this);
    dialog.resize(550,550);
    dialog.setStyleSheet("background-color:green;");
    dialog.setModal(true);
    dialog.show();
}

Widget::~Widget()
{
    delete ui;
}

这样写的话,dialog是模态窗口,但还是一闪而逝。

#include "widget.h"
#include "ui_widget.h"
#include <QDialog>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    QDialog *dialog = new QDialog(this);
    dialog->resize(550,550);
    dialog->setModal(true);
    dialog->setStyleSheet("background-color:green;");
    dialog->show();
}

Widget::~Widget()
{
    delete ui;
}

这样写的话,dialog是模态窗口,先显示dialog,关闭后,才显示widget。

5.

setWindowModel:

参数:设置模态对话框要阻塞的窗口类型

Qt::NonModel:不阻塞任何窗口

Qt::WindowModel:阻塞它的父窗口和所有祖先窗口和它们的子窗口

Qt::ApplicationModel(阻塞整个应用程序的所有窗口)

默认是Qt::ApplicationModel

---

学海无涯,加油! 


http://www.kler.cn/a/349005.html

相关文章:

  • 怎么把一段音频的人声和背景音乐分开?
  • 常见大模型架构模式
  • 一、el-table的滚动条加粗并解决遮挡内容问题
  • Linux:进程控制(三)——进程程序替换
  • 开发板资源介绍【STM32MP157 学习笔记】
  • Python剪辑视频
  • 内核定时器API实现点灯
  • 【鱼类识别】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面+TensorFlow
  • 国外电商系统开发-运维系统资产信息
  • XTuner微调internlm_chat_7b
  • 正则表达式 | Python、Julia 和 Shell 语法详解
  • 关于Oracle透明数据加密(TDE)的两个概念
  • 自动化运维
  • Windows安装Ollama环境
  • 软件测试工程师面试整理 —— 操作系统与网络基础!
  • SQL Server 常用关键词语法汇总
  • 报错Automatic merge failed; fix conflicts and then commit the result.
  • 前端环境搭建一览记录
  • 2022年华为杯数学建模竞赛D题论文和代码
  • JAVA-------动态代理