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

摘要:
今天,学习对话框输入控件的基类。1、 说明是对话框类窗口的基类。对话框窗口是顶级窗口,主要用于短期任务和与用户的短期通信。QDialog可以有返回值和默认按钮。ImportsysfromPyQt5.QTimport*app=QApplicationwindow=QWidget()窗口。resizele=QLineEditwindow。setWindowTitle=QDialog()d.setWindowTitle。exec()#请注意,在运行window之后。show()sys.exit,您会发现弹出一个对话框,并看到右上角的按钮?注意不要最小化和最大化!在窗口级别,对话框仅阻止其关联的窗口,用户可以与程序中的其他窗口交互。

今天学习对话框输入控件的基类(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_())

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

GUI学习之二十四——QDialog学习总结第1张

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

GUI学习之二十四——QDialog学习总结第2张

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

    窗口级别(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_())

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

GUI学习之二十四——QDialog学习总结第3张

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

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_())

这样就可以访问主界面了

GUI学习之二十四——QDialog学习总结第4张

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

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

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.是否显示尺寸调整控件

GUI学习之二十四——QDialog学习总结第5张

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

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被调用。

免责声明:文章转载自《GUI学习之二十四——QDialog学习总结》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Mysql中文检索匹配与正则ubuntu 12.04 修改 dhcp 为 static 后,IP仍会周期变为dhcp获取ip下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用Unity3D的50个技巧:Unity3D最佳实践!

关于这些技巧 这些技巧不可能适用于每个项目。 这些是基于我的一些项目经验,项目团队的规模从3人到20人不等; 框架结构的可重用性、清晰程度是有代价的——团队的规模和项目的规模决定你要在这个上面付出多少; 很多技巧是品味的问题(这里所列的所有技巧,可能有同样好的技术替代方案); 一些技巧可能是对传统的Unity开发的一个冲击。例如,使用prefab替代对象...

[转] 函数调用栈

http://kingj.iteye.com/blog/1555017 http://www.cnblogs.com/rain-lei/p/3622057.html   函数调用大家都不陌生,调用者向被调用者传递一些参数,然后执行被调用者的代码,最后被调用者向调用者返回结果,还有大家比较熟悉的一句话,就是函数调用是在栈上发生的,那么在计算机内部到底是如何实...

GUI的最终选择 Tkinter(九):事件

Tkinter事件处理 Tkinter应用会花费大部分的时间在处理事件循环中(通过mainloop()方法进入),事件可以是触发的鼠标,键盘的操作,管理窗口触发的重绘事件(在多数情况下都是有用户间接引起的)。 Tkinter提供了一个强大的机制,可以让你自由的去处理事件,对于每个组件来说。可以通过bond()方法将函数或者方法绑定到具体的事件上。当触发器的...

Lua function 函数

Lua支持面向对象,操作符为冒号‘:’。o:foo(x) <==> o.foo(o, x). Lua程序可以调用C语言或者Lua实现的函数。Lua基础库中的所有函数都是用C实现的。但这些细节对于lua程序员是透明的。调用一个用C实现的函数,和调用一个用Lua实现的函数,二者没有任何区别。 函数的参数跟局部变量一样,用传入的实参来初始化,多余的实...

QApplication的用法

QApplication的用法 来源 https://blog.csdn.net/qq_21342281/article/details/85322927 QApplication管理GUI程序的控制流和主要设置。 QApplication包含窗口系统和其他来源处理过和发送过的主事件循环。它也处理应用程序的初始化和收尾工作,并提供对话管理。QApplica...

GUI学习之二十八—QMessageBox

   今天来学习下QMessageBox。 QMessageBox主要用来通知用户或者请求用户提问和接收应答一个模态对话框。 一.对话框的构成 图标是有标准图标的,可以直接调用。 我们声明的消息框,初始状态都是模态的(阻塞程序,这里就不演示了),如果想把它变成非模态的,可以直接设置 mb = QMessageBox(self) # mb.setModa...