(13)对话框

简介: (13)对话框

Qt 中使用QDialog类实现对话框。就像主窗口一样,我们通常会设计一个类继承QDialog

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    setWindowTitle(tr("Main Window"));
 
    openAction = new QAction(QIcon(":/images/doc-open"), tr("&Open..."), this);
    openAction->setShortcuts(QKeySequence::Open);
    openAction->setStatusTip(tr("Open an existing file"));
    connect(openAction, &QAction::triggered, this, &MainWindow::open);
 
    QMenu *file = menuBar()->addMenu(tr("&File"));
    file->addAction(openAction);
 
    QToolBar *toolBar = addToolBar(tr("&File"));
    toolBar->addAction(openAction);
}
 
MainWindow::~MainWindow()
{
}
 
void MainWindow::open()
{
    QDialog dialog;
    dialog.setWindowTitle(tr("Hello, dialog!"));
    dialog.exec();
}

QDialog(及其子类,以及所有Qt::Dialog类型的类)的对于其 parent 指针都有额外的解释:如果 parent 为 NULL,则该对话框会作为一个顶层窗口,否则则作为其父组件的子对话框(此时,其默认出现的位置是 parent 的中心)。顶层窗口与非顶层窗口的区别在于,顶层窗口在任务栏会有自己的位置,而非顶层窗口则会共享其父组件的位置。



Qt 支持模态对话框和非模态对话框。其中,Qt 有两种级别的模态对话框:应用程序级别的模态和窗口级别的模态,默认是应用程序级别的模态。应用程序级别的模态是指,当该种模态的对话框出现时,用户必须首先对对话框进行交互,直到关闭对话框,然后才能访问程序中其他的窗口。窗口级别的模态是指,该模态仅仅阻塞与对话框关联的窗口,但是依然允许用户与程序中其它窗口交互。窗口级别的模态尤其适用于多窗口模式。



Qt 使用QDialog::exec()实现应用程序级别的模态对话框,使用QDialog::open()实现窗口级别的模态对话框,使用QDialog::show()实现非模态对话框。回顾一下我们的代码,在上面的示例中,我们调用了exec()将对话框显示出来,因此这就是一个模态对话框。当对话框出现时,我们不能与主窗口进行任何交互,直到我们关闭了该对话框。

void MainWindow::open()
{
    QDialog dialog;
    dialog.setWindowTitle(tr("Hello, dialog!"));
    dialog.exec();
}

//直接使用show会出现问题

下面我们试着将exec()修改为show(),看看非模态对话框:

void MainWindow::open()
{
    QDialog dialog(this);
    dialog.setWindowTitle(tr("Hello, dialog!"));
    dialog.show();
}

是不是事与愿违?对话框竟然一闪而过!这是因为,show()函数不会阻塞当前线程,对话框会显示出来,然后函数立即返回,代码继续执行。注意,dialog 是建立在栈上的,show()函数返回,MainWindow::open()函数结束,dialog 超出作用域被析构,因此对话框消失了。知道了原因就好改了,我们将 dialog 改成堆上建立,当然就没有这个问题了:

void MainWindow::open()
{
    QDialog *dialog = new QDialog;
    dialog->setWindowTitle(tr("Hello, dialog!"));
    dialog->show();
}

//



不过,这样做有一个问题:如果我们的对话框不是在一个界面类中出现呢?由于QWidget的 parent 必须是QWidget指针,那就限制了我们不能将一个普通的 C++ 类指针传给 Qt 对话框。另外,如果对内存占用有严格限制的话,当我们将主窗口作为 parent 时,主窗口不关闭,对话框就不会被销毁,所以会一直占用内存。在这种情景下,我们可以设置 dialog 的WindowAttribute:

void MainWindow::open()
{
    QDialog *dialog = new QDialog;
    dialog->setAttribute(Qt::WA_DeleteOnClose);
    dialog->setWindowTitle(tr("Hello, dialog!"));
    dialog->show();
}

setAttribute()函数设置对话框关闭时,自动销毁对话框。另外,QObject还有一个deleteLater()函数,该函数会在当前事件循环结束时销毁该对话框

相关文章
|
小程序
微信小程序的初始数据
微信小程序的初始数据
288 0
|
机器学习/深度学习 JSON JavaScript
在linux系统上看全世界新闻 -- Clinews的使用详解
这篇文章介绍了如何在Linux系统上使用Clinews命令行工具阅读全世界的新闻,包括安装、配置API密钥、使用命令获取新闻源和搜索新闻的步骤。
304 3
在linux系统上看全世界新闻 -- Clinews的使用详解
|
XML JavaScript 前端开发
JavaWeb基础4——HTML,JavaScript&CSS
HTML,JavaScript&CSS、元素、标签、css 选择器、属性、JavaScript基础语法、JavaScript对象、BOM浏览器对象模型、DOM文档对象模型、事件监听、正则对象RegExp/ES6
JavaWeb基础4——HTML,JavaScript&CSS
|
自动驾驶 物联网 5G
什么是 5G 以及它如何工作?
【8月更文挑战第23天】
3217 0
|
Unix Linux C++
Linuxc/c++之信号基础
这篇文章详细介绍了Linux下C/C++信号的基本概念、产生原因、处理过程、分类、注册与发送方法,以及信号屏蔽的机制。
201 0
Linuxc/c++之信号基础
|
人工智能 安全 API
本地部署马斯克开源Grok-1大模型,贝锐花生壳3步实现远程访问
在人工智能领域,除了在线工具如ChatGPT和Midjourney,本地部署的AI工具如Stable Diffusion同样重要,尤其在满足定制需求和确保数据安全方面。以马斯克的xAI开源项目Grok-1为例,这款拥有314B参数的大模型需要高性能硬件支持。借助贝锐花生壳的内网穿透技术,用户可通过简单的三步操作实现对这类AI工具的远程访问:安装并登录花生壳客户端、设置内网穿透映射、生成并使用远程访问地址。花生壳提供的HTTPS映射确保了访问的安全性,使远程使用AI工具变得更加便捷和安全。
445 1
|
编解码 开发工具 C#
[大牛直播SDK]Windows平台RTMP直播推送模块功能设计
大牛直播SDK采用全自研框架,具备高度可扩展性与自适应算法,显著降低延迟并提高采集编码效率。SDK以模块化设计,支持RTMP推流及多种音视频编码格式(如AAC、SPEEX、H.264、H.265),并能与播放器SDK组合实现丰富功能,包括流媒体转发、内置RTSP服务等。提供了详尽的参数配置选项,支持多摄像头、屏幕采集与水印叠加,并兼容Windows 7及以上操作系统。该SDK以C++/C#双接口形式提供,集成简便,同时包含调试与发布版本库,便于开发者快速上手。此外,支持断网重连、实时预览及多种编码前后的数据对接需求。
384 0
|
移动开发 小程序 UED
iBox系统系统开发iBox数字藏品电商平台开发之藏品交易部分源码
1.数字作品上传管理,2.数字作品发放规则3.作品共识版权唯一标识4.实名认证体系5.藏品品合成体系6.盲盒系统配置管理7.二级市场管理监督等系统功能8.藏品预约抢购机制等以下是iobx电商系统藏品交易的部分源码classPayextendsBaseApi{public$ibox_config;publicfunction__construct($params=[]){parent::__construct($params);$config=newConfigService();$this->shop_config=$confi
|
Java Linux Maven
设置 Maven 环境变量
配置Maven环境变量涉及Windows、Linux和Mac。在Windows上,需新建系统变量`MAVEN_HOME`,值为Maven安装路径,编辑`Path`添加`%MAVEN_HOME%\bin`。在Linux中,下载解压Maven后移动到`/usr/local/`,编辑`/etc/profile`添加`MAVEN_HOME`和`PATH`。在Mac上,类似Linux操作,下载解压后移动到`/usr/local/`,编辑`/etc/profile`。最后,通过`mvn -v`检查是否安装成功。
|
安全 测试技术
奥斯本检核表法
奥斯本检核表法
788 0