GUI学习之二十三——QDialog学习总结

今天学习对话框输入控件的基类(QDialog)。

一.描述

是对话类窗口(字体框、颜色选择、文件选择框等)的基类。

对话框窗口是顶级窗口(就是说不包含于哪个父类的显示界面里),主要用于短期任务和与用户的短期通信。

QDialogs是可以有返回值的(字体、颜色等),有默认按钮(确认、取消和关闭)。

二.对话框的种类

  对话框可以是模态或非模态的对话框

  模态对话框也分两种

    应用程序级别(exec()),当该种对话框出现时,用户必须首先对该对话框进行操作,直至关闭后才能访问程序中的其他窗口(注意是访问而不是操作,不关闭时都看不到)。

import sys
from PyQt5.Qt import *
app = QApplication(sys.argv)
window = QWidget()
window.resize(800,600)
le = QLineEdit(window)
window.setWindowTitle(‘主界面‘)
d = QDialog()
d.setWindowTitle(‘对话框‘)
d.exec()    #注意要在window.show的前面
window.show()
sys.exit(app.exec_())

运行以后会发现弹出了对话框

看到右上角的按钮了么?注意不是最小化最大化了!是一个提示按钮和关闭按钮。关闭界面以后才能弹出主界面。

注意并不是对话框把主界面遮盖了,你拖拽也能发现主界面是没有显示的。

    窗口级别(open()),对话框仅仅阻塞与其关联的窗口,用户可和程序内其他窗口交互。就像我们word文件里,打开’打开文件对话框‘,只要对话框不关闭是无法对其进行操作的。因为打开文件对话框和word的窗口是关联的

我们把上面代码中的exec改成open看看有什么效果

import sys
from PyQt5.Qt import *
app = QApplication(sys.argv)
window = QWidget()
window.resize(800,600)
le = QLineEdit(window)
window.setWindowTitle(‘主界面‘)
d = QDialog()
d.setWindowTitle(‘对话框‘)
d.open()    #注意要在window.show的前面
window.show()
sys.exit(app.exec_())

运行以后发现可以访问主界面啊

愿意是因为我们上面讲的,只阻塞和对话框关联的界面,所以我们在声明对话框时应该加上父级控件

d = QDialog(window)

这样就无法访问主界面了。

  非模态对话框

    非模态的只有一种状态(show()),在使用中不会阻塞与对话框关联的窗口进行交互,就像word里的查找对话框,对话框即使不关闭也可以对主窗口进行交互。

import sys
from PyQt5.Qt import *
app = QApplication(sys.argv)
window = QWidget()
window.resize(800,600)
le = QLineEdit(window)
window.setWindowTitle(‘主界面‘)
d = QDialog(window)
d.setWindowTitle(‘对话框‘)
d.show()    #注意要在window.show的前面
window.show()
sys.exit(app.exec_())

这样就可以访问主界面了

这里要注意一点:在访问主界面的时候对话框是在主界面上面的。两个可以同时操作互不影响。

    非模态的对话框也可以结合下面的语法实现为模态对话框。

QDialog.setModal(self, modal: bool)

或者这样

QDialog.setWindowModality(self, windowModality: QtCore.Qt.WindowModality)
NonModal = ...  # type: ‘Qt.WindowModality‘
WindowModal = ...  # type: ‘Qt.WindowModality‘
ApplicationModal = ...  # type: ‘Qt.WindowModality‘

三.常用功能作用

1.是否显示尺寸调整控件

控件右下角有尺寸调整控件

QDialog.setSizeGripEnabled(self, a0: bool)
QDialog.isSizeGripEnabled()

2.常用槽函数

QDialog.accept()                #返回值为1
QDialog.reject()                #返回值为0
QDialog.done(self, a0: int)     #返回值为设定值

可以看一下效果

import sys
from PyQt5.Qt import *
app = QApplication(sys.argv)
window = QWidget()
window.resize(800,600)
le = QLineEdit(window)
window.setWindowTitle(‘主界面‘)
d = QDialog(window)
d.setWindowTitle(‘对话框‘)
btn1 = QPushButton(‘btn1‘,d)
btn1.clicked.connect(lambda :d.accept())
btn1.move(100,200)
btn2 = QPushButton(‘btn2‘,d)
btn2.move(250,200)
btn2.clicked.connect(lambda :d.reject())
btn3 = QPushButton(‘btn3‘,d)
btn3.move(500,200)
btn3.clicked.connect(lambda :d.done(123))
result = d.exec()    #注意要在window.show的前面
print(result)
window.show()
sys.exit(app.exec_())

点击按钮,可以看出不同的槽有不同的返回值的。

当然,我们还可以给对话框设定一个返回值

QDialog.setResult()
QDialog.result()
import sys
from PyQt5.Qt import *
app = QApplication(sys.argv)
window = QWidget()
window.resize(800,600)
le = QLineEdit(window)
window.setWindowTitle(‘主界面‘)
d = QDialog(window)
d.setWindowTitle(‘对话框‘)
btn1 = QPushButton(‘btn1‘,d)
btn1.clicked.connect(lambda :d.accept())
btn1.move(100,200)
btn2 = QPushButton(‘btn2‘,d)
btn2.move(250,200)
btn2.clicked.connect(lambda :print(d.result()))     #获取返回值
btn3 = QPushButton(‘btn3‘,d)
btn3.move(500,200)
btn3.clicked.connect(lambda :d.setResult(112233))   #设定返回值
result = d.exec()
print(result)
window.show()
sys.exit(app.exec_())

如果不设置直接点击btn2的话,默认的返回值为0。并且这个方法是在不关闭对话框的前提下获得返回值。

四.信号

和上面的槽对应,有相应的信号

accept——accepted

reject——rejected

done——finished

结合槽和信号就一个案例说明所有的问题

import sys
from PyQt5.Qt import *
app = QApplication(sys.argv)
window = QWidget()
window.resize(800,600)
le = QLineEdit(window)
window.setWindowTitle(‘主界面‘)
d = QDialog(window)
d.setWindowTitle(‘对话框‘)
btn1 = QPushButton(‘btn1‘,d)
btn1.clicked.connect(lambda :d.accept())
d.accepted.connect(lambda :print(‘btn1 is clicked‘))
btn1.move(100,200)
btn2 = QPushButton(‘btn2‘,d)
btn2.move(250,200)
btn2.clicked.connect(lambda :print(d.reject()))     #获取返回值
d.rejected.connect(lambda :print(‘btn2 is clicked‘))
btn3 = QPushButton(‘btn3‘,d)
btn3.move(500,200)
btn3.clicked.connect(lambda :d.done(112233))   #设定返回值
d.finished.connect(lambda val:print(‘btn3 is clicked‘,val))
result = d.exec()
print(result)
window.show()
sys.exit(app.exec_())

点击一下各个按钮会发现一个现象:不了点击哪个按钮都会显示btn3被点击,所以说accepted和rejected都会导致finished被调用。

原文地址:https://www.cnblogs.com/yinsedeyinse/p/11042172.html

时间: 2024-10-07 08:19:09

GUI学习之二十三——QDialog学习总结的相关文章

angular学习笔记(二十三)-$http(1)-api

之前说到的$http.get和$http.post,都是基于$http的快捷方式.下面来说说完整的$http: $http(config) $http接受一个json格式的参数config: config的格式如下: { method:字符串 , url:字符串, params:json对象, data:请求数据, headers:请求头, transformRequest:函数,转换post请求的数据的格式, transformResponse:函数,转换响应到的数据的格式, cache:布尔

Java学习系列(二十三)Java面向对象之内部类详解

一.前言 内部类也称寄生类,就是把一个类放在类里面(即内部类的上一级程序单元是类)定义,将其作为外部类的成员.内部类主要用几种定义形式:静态(static)内部类,非静态内部类,匿名内部类(也就是没有名字的寄生类).内部类的好处就是内部类可以直接外部类的(包括私有)成员,反之不能.下面我们通过一些实例来详细讲解一下Java中内部类的使用及几种定义形式的相互调用. 二.实例说明 (1)匿名内部类:当程序创建匿名内部类时,会立即创建匿名内部类(实现类)的实例. interface IBreathe

(转)【D3D11游戏编程】学习笔记二十三:Cube Mapping进阶之动态环境图

(注:[D3D11游戏编程]学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 在前面两篇介绍Cube Mapping的文章中,我们所使用到的Cube Map都是事先制作好的,这样的一个好处就是运行时效率很高,适合于大多数情形.但如果对于即时动态变化的场景来说,依靠静态图来实现反射效果就不再适用了.因为在不同时刻,一个物体周围的场景是不断变化的,想要把这些变化在物表的反射中体现出来,就需要一张动态的环境图. 1.C

Log4J学习【二十三】常用的Appender之SocketAppender

前面这几个Appender就是Log4J提供的基于文件系统的Appender.当然,在一些特殊的需要记录到文件的Appender来说,我们只需要选择一个合适的Appender来继承并完成自己的逻辑即可.关于自定义Appender,待会再看.下面来看几个比较特殊的Appender. 前面所有介绍的Appender都有一个共同的特点,就是他们都需要配置一个Layout对象,下面要介绍的这个Appender非常特殊,他本身不需要任何Layout对象,这个Appender就是SocketAppender

智能车学习(二十三)——浅谈心得体会

      因为毕竟是竞赛,跟学校挂钩,没办法开源代码和算法完成思路,所以不能详细写太多,如果可以等价交换的话,应该还是可以向领导申请一下的.       在厦大信科通信系,参加这个比赛,大家都觉得性价比太低,毕竟这个系,学霸太多,能力太强,课程多,分数还必须要高,如果参加这种要花大半年的时间来准备,但是却只能抱着不确定性拿奖的比赛,对于那些拼保研名额的同学简直有点太过于奢侈.所以基本上选择了创客类比赛,电子设计竞赛,ACM,数学建模,这些短周期的比赛.其实我也纠结了很久,其实,本来我也就是简简

javaweb学习总结二十三(servlet开发之线程安全问题)

一:servlet线程安全问题发生的条件 如果多个客户端访问同一个servlet时,发生线程安全问题,那么它们访问的是相同的资源.如果访问 的不是相同资源,则不存在线程安全问题. 实例1:不会产生线程安全问题,因为每个客户端发送请求,都会创建一个线程,都会创建一个count 不存在资源共享的问题. 1 public void doPost(HttpServletRequest request, HttpServletResponse response) 2 throws ServletExcep

【转】JMeter学习(二十三)关联

话说LoadRunner有的一些功能,比如:参数化.检查点.集合点.关联,Jmeter也都有这些功能,只是功能可能稍弱一些,今天就关联来讲解一下. JMeter的关联方法有两种:后置处理器-正则表达式提取器与XPath Extractor. 一.正则表达式提取器 1.添加正则表达式 在需要获得数据的上一个请求上右击添加一个后置处理器-->正则表达式提取器 解释: (1)引用名称:下一个请求要引用的参数名称,如填写activityID,则可用${activityID}引用它. (2)正则表达式:

轻松学习JavaScript二十三:DOM编程学习之操作表格

一使用HTML标签创建表格: 代码: <span style="font-size:18px;"><table border="1px"width="300px"> <caption>人员表</caption> <thead> <tr> <th>姓名</th> <th>性别</th> <th>年龄</th>

智能车学习(二十三)&mdash;&mdash;K60单片机注册中断函数

一.头文件: #ifndef __ISR_H #define __ISR_H 1 #include "include.h" /* 重新定义中断向量表 * 先取消默认的中断向量元素宏定义 #undef VECTOR_xxx * 在重新定义到自己编写的中断函数 #define VECTOR_xxx xxx_IRQHandler * 例如: * #undef VECTOR_003 * #define VECTOR_003 HardFault_Handler 重新定义硬件上访中断服务函数 *