首页 > 其他分享 >【Qt】对话框

【Qt】对话框

时间:2024-09-04 21:25:43浏览次数:4  
标签:模态 Qt 对话框 点击 QDialog 按钮

 对话框的基本概念

        在使用某些网站的时候,有时会不经意间弹出各种奇奇怪怪的窗口。这种窗口就被称之为对话框。对话框往往是用户与用户之间进行“短平快"的操作。

对话框是 GUI 程序中不可或缺的组成部分。⼀些不适合在主窗⼝实现的功能组件可以设置在对话框中。对话框通常是⼀个顶层窗⼝,出现在程序最上层,⽤于实现短期任务或者简洁的⽤户交互。

Qt中使用QDialog类表示对话框。关于对话框,针对一个已有的项目,可以创建出一些类,继承自QDialog实现自定义的对话框,也可以使用由Qt给提供的现成的对话框。

内置对话框有:QFiledialog(⽂件对话框)、QColorDialog(颜⾊对话框)、QFontDialog (字体对话框)、QInputDialog (输⼊对话框)和 QMessageBox(消息框) 

例子:观察QDialog窗口

基于QDialoh作为父类创建出来的程序窗口和之前通过QWidget创建出来的窗口是非常相似的。

 

在实际开发过程中,使用更多的情况,往往不是直接在创建项目的时候继承自QDialog,而是在代码中,创建额外的类,让额外的类继承自QDialog。

【说明】主窗口一般是不会作为一个对话框,主窗口一般可以在产生出一些其他的对话框。

对话框的内存释放问题

例子:点击按钮弹出对话框

(1)在Qt Desiger中设置一个按钮

(2)编辑点击按钮的槽函数

QDialog其实也是QWidget的子类,QWidget的各种属性方法,QDialog都可以进行使用。

【注意】不同于界面上的其他控件,此处QDialog每次按下按钮,都会创建一个新的QDialog对象,并进行显示,每次点击都会创建新的对话框对象。这就会导致一个程序在运行过程中,可以无数次点击这个按钮,进一步就会产生无数个这样的对象,也就会产生内存泄漏问题。

        虽然QDialog的父元素设置为this,QMainWindow被销毁的时候,此时QDialog也会随之销毁,但是如果QMainWindow在QMainWindow销毁之前存在多个就无法实现销毁。(可能用户不会创建多个QDialog对象,但是可能QDialog对象占用内存较大,或者其机器本身剩余的内存较少(嵌入式系统))。

如果将将delete放在点击按钮的槽函数中,对话框只会一闪而过。

正确的操作应该是:用户在点击对话框关闭按钮的时候,再来触发delete操作。

而Qt为了让程序员写的方便,直接给QDialog设置了一个属性,可以通过设置属性,进而完成上述操作。

例子:自定义对话框界面

要想自定义对话框,就需要继承自QDialog创建类。有俩种方式

(1)纯代码的方式自定义QDialog界面

(2)通过图形化的方式

方法一:纯代码的方式自定

(1)使用Qt Designer设置一个按钮

(2)点击编写点击按钮的槽函数

(3)创建一个Dialog类

(4)编写点击按钮的槽函数

由于构造dialog对象指定了父对象,所以构造函数的时候需要指定父对象。

(5)Dialog的构造函数

在这个构造函数中,它调用了父类 QDialog 的构造函数,将 parent 参数传递给父类构造函数,以便在 Qt 的对象层次结构中正确地设置父 - 子关系。

(6)编写对话框里的内容

方法二:通过图形化界面的方式

(1)创建一个QMainWindow窗口,打开Qt Designer并创建一个按钮

(2)右键点击按钮转到槽函数

(3)新建对话框ui文件

通过图形化界面的方式,其关键操作就是需要创建一个新的ui文件

(4)编辑对话框ui文件,设置一个label与PushButton

(5)编辑mianWindow.cpp文件,包含dialog.h头文件,编辑点击按钮弹出对话框

(6)编辑dialog.ui文件,右键点击按钮转到槽,编辑点击按钮关闭对话框的槽函数

(8)运行程序

模态对话框

对话框分为:模态对话框以及非模态对话框

模态:是指弹出对话框的时候,此时用户无法操作父窗口,必须得先完成对话框内部出的操作,关闭对话框之后才可与父窗口进行交互。

非模态:弹出对话框的时候,用户可以操作父窗口。

模态对话框用户特别关键的场合,用户必须要做出决策。

  • 模态对话框指的是:显⽰后⽆法与⽗窗⼝进⾏交互,是⼀种阻塞式的对话框。使⽤ QDialog::exec() 函数 调⽤。

    模态对话框适⽤于必须依赖⽤⼾选择的场合,⽐如消息显⽰,⽂件选择,打印设置等。

  • ⾮模态对话框显⽰后独⽴存在,可以同时与⽗窗⼝进⾏交互,是⼀种⾮阻塞式对话框,使⽤ QDialog::show()函数调⽤。

    ⾮模态对话框适⽤于特殊功能设置的场合,⽐如查找操作,属性设置等。

    ⾮模态对话框⼀般在堆上创建,这是因为如果创建在栈上时,弹出的⾮模态对话框就会⼀闪⽽过。同 时还需要设置 Qt:WA_DeleteOnClose 属性,⽬的是:当创建多个⾮模态对话框时(如打开了多个⾮模态窗⼝),为了避免内存泄漏要设置此属性

前文介绍的例子,都是“非模态”对话框。那么如何产生模态对话框?将show函数换成exec函数即可。

Qt内置对话框

Qt中提供了多种可复⽤的对话框类型,即 Qt 标准对话框。Qt 标准对话框全部继承于 QDialog类。常⽤标准对话框如下:

 

标签:模态,Qt,对话框,点击,QDialog,按钮
From: https://blog.csdn.net/dab112/article/details/141720223

相关文章

  • 基于Shiny的LLM对话框
    Shiny介绍     Shiny最初是一个R语言的包,由RStudio开发,它的主要作用是允许用户创建交互式的Web应用程序而无需深入学习复杂的Web开发技术,我相信做R开发的同学基本都知道这个R包。以下是Shiny的一些具体作用:简化Web开发:Shiny提供了一种简便的方法来创建......
  • qt之QTableview右击显示菜单选项
     由于上下文菜单添加的action后右击鼠标也会触发QAction的triggered信号,所以添加了事件过滤,并且安装给QMenu的实列化。(代码粘贴复制到vs即可运行)file.h--------------------------------------------------------------------------------------------------#include<QtWidge......
  • 2-STM32F103+ML307(中移4G Cat1)基本控制篇(自建物联网平台)-整体运行测试-Android扫
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/ZLIOTB/ML307/my.html"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p>  说明这节测试一......
  • Qt项目转换为VS项目
    我们使用VS的“打开本地文件夹”打开我们使用QtCreator创建的项目打开以后资源管理器内容如下图所示如果希望将Qt项目转为VS项目,需要安装下面的扩展,点击扩展-->管理扩展,然后输入qt进行搜索,安装:QtVisualStudioTools在提示下载完成以后,需要关闭VS进行扩展安装,安装过程中可......
  • 如何使用四博智联ESP32-C6开发板的Zigbee功能,将其作为MQTT+Zigbee网关来控制Zigbee多
    参考了乔帮主的:ESP32-C6开发板Zigbee功能抢先体验(MQTT+Zigbee网关+灯)DF创客社区关于ZigBee的原理和知识,这里就不重复了,网上的资料非常的丰富。乐鑫为Zigbee功能,提供了专门的SDK支持:GitHub-espressif/esp-zigbee-sdk:EspressifZigbeeSDK在ESP-IDF中,也专门提供了实例......
  • 如何在Pyqt中渲染使用svggraphicsItem的SVG字形?
    在使用PyQt构建应用程序时,有时需要在图形用户界面中渲染SVG(可缩放矢量图形)文件,特别是当你需要显示图标或自定义字体时。QGraphicsSvgItem是PyQt提供的一个类,用于在QGraphicsView或QGraphicsScene中渲染SVG图像。然而,如果你想使用SVG字形或通过编程方式生成矢量图形,QS......
  • QT项目学习
    打开QtCreator界面选择NewProject或者选择菜单栏【文件】-【新建文件或项目】菜单项弹出NewProject对话框,选择QtWidgetsApplication选择【Choose】按钮,弹出如下对话框设置项目名称和路径,按照向导进行下一步选择编译套件向导会默认添加一个继承自QMainWindow的类,可以......
  • 物联网通讯协议MQTT、NB-IOT、Zigbee、CoAP、RFID、BLUETOOTH、NFC、4G和HTTP
    物联网协议集一、按网络四层协议分类NB-IoT,LORA,WIFI,蓝牙,zigbee,4G都是物理层的,这几个都需要芯片模组支持(硬件支持)而MQTT,COAP,HTTP都是应用层协议,这些需要开发服务器,或者对接云平台厂商(软件支持)所以(MQTT,COAP,HTTP)是居于(NB-IoT,LORA,WIFI,蓝牙,zigbee,4G)的上层协议物理层中二、按需要网关来分......
  • MQTT揭秘:为什么它是物联网首选的通信协议
    MQTT协议简介概览MQTT是一种基于发布/订阅模式的轻量级消息传输协议,专门针对低带宽和不稳定网络环境的物联网应用而设计,可以用极少的代码为联网设备提供实时可靠的消息服务。MQTT协议广泛应用于物联网、移动互联网、智能硬件、车联网、智慧城市、远程医疗、电力、石油与能源等领......
  • PyQt5
    一、介绍PyQt基于QT库的python封装,是一个图形用户界面(GUI)工具包,允许用户使用python语言创建桌面应用程序。目前,不同版本中,PyQt5是较为流行的版本,支持python2.7和python3.x。PyQt支持两种开发方式,可视化和编程化。-编程式创建界面无需多说,pip安装成功以后,有较深基础功底......