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

PyQt5桌面应用开发(5):对话框

本文目录

  • PyQt5桌面应用系列
  • 对话框
  • `QDialog`
    • `QDialog`的基本用法
    • 按钮组
  • `QMessageBox`
  • 综合展示的例子
  • 结论

PyQt5桌面应用系列

  • PyQt5桌面应用开发(1):需求分析
  • PyQt5桌面应用开发(2):事件循环
  • PyQt5桌面应用开发(3):并行设计
  • PyQt5桌面应用开发(4):界面设计
  • PyQt5桌面应用开发(5):对话框
  • [PyQt5桌面应用开发(7):文本编辑+语法高亮与行号](https://withstand.blog.csdn.net/article/details/130486145

对话框

对话框在GUI中是一个常见的组件,用于和用户进行交互。这个交互分为两个部分。

  • 为用户提示信息,获取用户的注意;
  • 为用户提供输入信息的界面。

PyQt5提供了一些内置的对话框,也可以自定义对话框。所有的PyQt5对话框都是QDialog的子类。

QDialog

QDialog的基本用法

QDialog定义的信号有:

  • accepted():用户点击了对话框的确认按钮;
  • finished(int result):用户点击了对话框的确认或取消按钮,resultQDialog的返回值,QDialog的返回值是QDialog.AcceptedQDialog.Rejected
  • rejected():用户点击了对话框的取消按钮。

还包括从QWidget继承的信号:

  • updateMicroFocus():更新对话框的焦点。
  • windowTitleChanged(const QString &title):对话框的标题发生了变化。
  • customContextMenuRequested(const QPoint &pos):用户请求了自定义的上下文菜单。
  • windowIconChanged(const QIcon &icon):对话框的图标发生了变化。
  • windowIconTextChanged(const QString &iconText):对话框的图标文字发生了变化。
  • windowModalityChanged(Qt::WindowModality windowModality):对话框的模态性发生了变化。
  • windowOpacityChanged(qreal level):对话框的透明度发生了变化。
  • windowStateChanged(Qt::WindowStates oldState, Qt::WindowStates newState):对话框的状态发生了变化。

实际上,我们需要关注的就是accepted()rejected()信号。目前PyQt5推荐采用open()方法显示对话框,这种情况下,就应该连接finished信号来处理对话框的返回值。这一点应该引起注意,好多网上的例子都用exec()等方法来显示对话框,这不是PyQt5推荐的方法,官方文档中专门针对这个进行了说明。

Note: Avoid using this function; instead, use open(). Unlike exec(), open() is asynchronous, and does not spin an additional event loop. This prevents a series of dangerous bugs from happening (e.g. deleting the dialog’s parent while the dialog is open via exec()). When using open() you can connect to the finished() signal of QDialog to be notified when the dialog is closed.

注意:避免使用这个函数,而是使用open()。与exec()不同,open()是异步的,不会再启动一个事件循环。这样可以避免一系列的危险bug(例如,当对话框通过exec()打开时,删除对话框的父窗口)。当使用open()时,可以连接到QDialogfinished()信号,以便在对话框关闭时得到通知。

我们可以自己定义QPushButton,然后连接clicked信号到accept()reject()槽,这样就可以在点击按钮时关闭对话框。

按钮组

但是PyQt5还提供了一些默认的按钮组件。

  • QDialogButtonBox.Ok
  • QDialogButtonBox.Open
  • QDialogButtonBox.Save
  • QDialogButtonBox.Cancel
  • QDialogButtonBox.Close
  • QDialogButtonBox.Discard
  • QDialogButtonBox.Apply
  • QDialogButtonBox.Reset
  • QDialogButtonBox.RestoreDefaults
  • QDialogButtonBox.Help
  • QDialogButtonBox.SaveAll
  • QDialogButtonBox.Yes
  • QDialogButtonBox.YesToAll
  • QDialogButtonBox.No
  • QDialogButtonBox.Abort
  • QDialogButtonBox.Retry
  • QDialogButtonBox.Ignore
  • QDialogButtonBox.NoButton

典型的用法是:

QBtn = QDialogButtonBox.Ok | QDialogButtonBox.Cancel# connect buttons to slots to set result value of the dialog
self.buttonBox = QDialogButtonBox(QBtn)
self.buttonBox.accepted.connect(self.accept)
self.buttonBox.rejected.connect(self.reject)

QDialog是一个QWidget,所以可以使用通用的布局组件来放置所有的控件,并有所有属性操作,例如setWindowTitle()方法设置对话框的标题。QDialogButtonBox也按照需求放在布局中。

QMessageBox

为了方便展示信息,PyQt5提供了QMessageBox组件。QMessageBox提供了一些静态方法,可以直接调用,例如:

  • QMessageBox.about()
  • QMessageBox.aboutQt()
  • QMessageBox.critical()
  • QMessageBox.information()
  • QMessageBox.question()
  • QMessageBox.warning()
  • QMessageBox.error()

也可以创建一个QMessageBox实例,然后调用open()方法显示对话框。这时,可以用message_box.setStandardButtons(QMessageBox.Yes | QMessageBox.No)方法设置默认按钮。

这里有很多可以选的按钮,例如:

  • QMessageBox.Ok
  • QMessageBox.Open
  • QMessageBox.Save
  • QMessageBox.Cancel
  • QMessageBox.Close
  • QMessageBox.Discard
  • QMessageBox.Apply
  • QMessageBox.Reset
  • QMessageBox.RestoreDefaults
  • QMessageBox.Help
  • QMessageBox.SaveAll
  • QMessageBox.Yes
  • QMessageBox.YesToAll
  • QMessageBox.No
  • QMessageBox.NoToAll
  • QMessageBox.Abort
  • QMessageBox.Retry
  • QMessageBox.Ignore
  • QMessageBox.NoButton

QMessageBox的返回值对应于这些按钮,例如QMessageBox.YesQMessageBox.NoQMessageBox.Cancel等。

综合展示的例子

综合上面的例子,可以整一个综合的例子,包括QDialogQMessageBoxQDialogButtonBox等。

import sysfrom PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtWidgets import QApplication, QDialog, QMainWindow, QHBoxLayout, QPushButton, QWidget, QVBoxLayout, \QTextEdit, QDialogButtonBox, QLabel, QMessageBoxclass EmptyDialog(QDialog):def __init__(self, parent=None):super(EmptyDialog, self).__init__(parent)self.setWindowTitle("BigEmptyDialog")self.resize(400, 300)class CustomDialog(QDialog):def __init__(self, parent=None):super(CustomDialog, self).__init__(parent)self.setWindowTitle("ButtonBox")QBtn = QDialogButtonBox.Ok | QDialogButtonBox.Cancel# connect buttons to slots to set result value of the dialogself.buttonBox = QDialogButtonBox(QBtn)self.buttonBox.accepted.connect(self.accept)self.buttonBox.rejected.connect(self.reject)self.layout = QVBoxLayout()message = QLabel("Something happened, is that OK?")self.layout.addWidget(message)self.layout.addWidget(self.buttonBox)self.setLayout(self.layout)def make_buttons(parent: QWidget, output: QTextEdit):button1 = QPushButton("Show EmptyDialog", parent)dlg1 = EmptyDialog(parent)button1.clicked.connect(dlg1.open)dlg1.finished.connect(lambda result: output.append(f"EmptyDialog finished."))button2 = QPushButton("Show CustomDialog", parent)dlg2 = CustomDialog(parent)button2.clicked.connect(dlg2.open)dlg2.finished.connect(lambda result: output.append(f"CustomDialog result: {result==QDialog.Accepted}"))button3 = QPushButton("MessageBox", parent)dlg3 = QMessageBox(parent)dlg3.setWindowTitle("I have a question!")dlg3.setText("This is a simple dialog")dlg3.setStandardButtons(QMessageBox.Yes | QMessageBox.No)dlg3.setIcon(QMessageBox.Question)dlg3.finished.connect(lambda result: output.append(f"MessageBox result: {result == QMessageBox.Yes}"))button3.clicked.connect(dlg3.open)bs = []for builtins, label in zip([QMessageBox.about,QMessageBox.critical,QMessageBox.information,QMessageBox.question,QMessageBox.warning, ], ["about", "critical", "information", "question", "warning"]):button = QPushButton(f"Show QMessageBox.{label}")button.clicked.connect(lambda checked: builtins(parent, f"QMessageBox.{label}", f"Is {label} look fine?"))bs.append(button)bs.extend([button1, button2, button3])return bsif __name__ == '__main__':app = QApplication(sys.argv)win = QMainWindow()win.setWindowTitle("Dialog buttons")# center widgetcenter = QWidget(win)border = QHBoxLayout()center.setLayout(border)text = QTextEdit(center)button_layout = QVBoxLayout()button_layout.setAlignment(Qt.AlignTop)buttons = make_buttons(center, text)for b in buttons:button_layout.addWidget(b)border.addLayout(button_layout)border.setStretch(0, 1)center_layout = QHBoxLayout()border.addLayout(center_layout)border.setStretch(1, 6)center_layout.addWidget(text)# Show the windowwin.setCentralWidget(center)win.setMinimumSize(1024, 768)win.setWindowIcon(QIcon(QPixmap("icon.png")))win.show()sys.exit(app.exec_())

结论

  1. QDialog是一个QWidget,所以可以制作任意复杂的对话框。
  2. QMessageBox提供了一个快速的实现。
  3. QDialogButtonBox提供了一组标准的按钮,可以方便的使用。
  4. QDialog及其子类会找其parent搜索Icon。

相关文章:

PyQt5桌面应用开发(5):对话框

本文目录 PyQt5桌面应用系列对话框QDialogQDialog的基本用法按钮组 QMessageBox综合展示的例子结论 PyQt5桌面应用系列 PyQt5桌面应用开发(1):需求分析 PyQt5桌面应用开发(2):事件循环 PyQt5桌面应用开发&a…...

整洁的代码

文章目录 为什么要写整洁的代码什么是整洁的代码可读性运行效率扩展性 怎么写整洁的代码注释&命名函数&类代码结构 为什么要写整洁的代码 为什么要写整洁的代码,回答这个问题之前,也许应该想想写糟糕的代码的原因 是想快点完成吗?还是要赶时间吗?有可能.或许你觉得…...

Redis集群常用命令及说明

一、集群的特点 1、集群架构特点 (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽; (2)节点的fail是通过集群中超过半数的节点检测失效时才生效…...

使用edge浏览器,白嫖ChatGPT的保姆级教程来了

前言 嗨,大家好,我是希留,一个被迫致力于全栈开发的老菜鸟。 人工智能大浪潮已经来临,对于ChatGPT,我觉得任何一个玩互联网的人,都应该重视起来,用起来。但是国内使用需要解决科学上网、注册、…...

新人入职,都用这三招,让你安全度过试用期

刚入职工作 3招让你安全度过试用期 给新手小伙伴们分享几招 让你们能在试用期的时候平滑去度过 那么第一第一点就是 能自己解决的千万不要去问 千万不要去问 因为往往我们在去面试的时候 我们往往都是备足了很多的资料 备足了很多的面试题库 然后呢 你在给人家面试的时候总有一…...

小程序上车,车载小程序的信息安全是否可靠?

随着智能交通和车联网技术的快速发展,越来越多的车载应用程序(APP)进入人们的视野,从而推动了车载业务生态的不断发展。然而,车载应用程序的安全问题也引起了人们的广泛关注。为此,小程序容器技术作为一种有…...

华为OD机试 - 识图谱新词挖掘(Python)

题目描述 小华负责公司知识图谱产品,现在要通过新词挖掘完善知识图谱。 新词挖掘:给出一个待挖掘问题内容字符串Content和一个词的字符串word,找到content中所有word的新词。 新词:使用词word的字符排列形成的字符串。 请帮小华实现新词挖掘,返回发现的新词的数量。 …...

( 数组和矩阵) 378. 有序矩阵中第 K 小的元素 ——【Leetcode每日一题】

❓378. 有序矩阵中第 K 小的元素 难度:中等 给你一个 n x n n x n nxn 矩阵 m a t r i x matrix matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。 请注意,它是 排序后 的第 k 小元素,而不是第 …...

HBase架构篇 - Hadoop家族的天之骄子HBase

HBase的基本组成结构 表(table) HBase 的数据存储在表中。表名是一个字符串。表由行和列组成。 行(row) HBase 的行由行键(rowkey)和 n 个列(column)组成。行键没有数据类型&…...

STL及常用容器vector、list和deque的介绍

vector和built-in数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随机存取,即[]操作符,即可以以数组下标的方式来访问或遍历。但由于它的内存空间是连续的,所以在中间进行插入和删除会造成内存块的拷贝,另外,当该数组后的内存空间不够时,需…...

SpringBoot统一功能处理(统⼀⽤户登录权限验证、统⼀异常处理、统⼀数据格式封装)

统⼀⽤户登录权限验证 1、最初的用户登录效验:在每个方法里面获取session和 session 中的用户信息,如果存在用户,那么就认为登录成功了,否则就登录失败了。 2、第二版用户登录效验:提供了统一的方法,在每个需要验证的方法中调用…...

华为实习笔试复盘(1)配送站和客户问题

写在前面 自己玩了很多项目,但是最近准备秋招的过程中,发现自己对于算法和编程语言的基本功夫实在是太欠缺了。 投递了华为的实习岗位,4.26参加机考,一做题就发现了自己很多地方都不会。这里写下笔试后的复盘以警醒自己。 题目 …...

alibaba yalantingLibs struct_pack代码梳理

这里写目录标题 struct_pack 接口序列化序列化对象到新字节容器序列化对象到容器尾部将序列化结果保存到指针指向的内存中多参数序列化将序列化结果保存到输出流自定义类型序列化序列化到自定义的输出流 反序列化基本反序列化从指针指向的内存中反序列化反序列化到已有对象多参…...

JavaWeb( 二 ) URL

1.4.URL统一资源定位符 URL代表Uniform Resource Locator 统一资源定位符,也叫 URL地址 。是用于标识和定位Web上资源的地址,通常用于在Web浏览器中访问网站和文件。 URL由若干部分组成,scheme:// host : port / path 例如: htt…...

Python斐波那契数列

斐波那契数列是一个经典的数学问题&#xff0c;在 Python 中可以使用多种方法来实现&#xff0c;下面是几个常见的实现方式&#xff1a; 1. 使用递归 python def fibonacci_recursive(n): if n < 1: return n else: return fibonacci_recursive(n…...

华为OD机试 - 模拟商场优惠打折(Python)

题目描述 模拟商场优惠打折,有三种优惠券可以用,满减券、打折券和无门槛券。 满减券:满100减10,满200减20,满300减30,满400减40,以此类推不限制使用; 打折券:固定折扣92折,且打折之后向下取整,每次购物只能用1次; 无门槛券:一张券减5元,没有使用限制。 每个人…...

【JAVA程序设计】(C00132)基于SSM的固定资产管理系统

基于SSM的固定资产管理系统 项目简介项目获取开发环境项目技术运行截图 项目简介 本系统为基于SSM的固定资产管理系统&#xff0c;本系统分为二种用户&#xff1a;超级管理员和普通管理员&#xff1b; 超级管理员功能&#xff1a; 首页查看、设备管理、平台账户管理、设备台账…...

简单的无理函数的不定积分

前置知识&#xff1a; 直接积分法有理函数的不定积分 简单的无理函数的不定积分 对无理函数积分的基本方法就是通过换元将其化为有理函数的积分。下面讲讲几类无理函数积分的求法。 注&#xff1a; R ( u , v ) R(u,v) R(u,v)是由 u , v u,v u,v与常数经过有限次四则运算得…...

《国际联网安全保护管理办法》

1.基本信息 &#xff08;1997年12月11日国务院批准 1997年12月16日公安部令第33号发布 根据2011年1月8日《国务院关于废止和修改部分行政法规的决定》修订&#xff09; 2.办法内容 第一章 总 则 第一条为了加强对计算机信息网络国际联网的安全保护&#xff0c;维护公共…...

Redis常用命令

目录 一. 字符串string常用操作命令 二. 哈希hash常用操作命令 三. 列表list常用操作命令 四. 集合set常用操作命令 五. 有序集合sorted set常用操作命令 六. 通用命令 一. 字符串string常用操作命令 SET key value 设置指定key的值GET key 获取指定key的值 SETEX key…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7…...

Vue3中的computer和watch

computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...