5、使用Qt Designer模拟打印的界面
实现功能:在打印时可以设置打印的份数、纸张类型,触发“打印”按钮后,将执行结果显示在右侧;通过QCheckBox(“全屏预览”复选框)来选择是否通过全屏模式进行预览,将执行结果显示在右侧。按F1键,可以显示helpMessage信息。
实现步骤:(1)使用Qt Designer新建一个模板名为“Widget”的简单窗口,该窗口文件名为MainWinSignalSlog02.ui。通过将Widget Box区域的控件拖拽到窗口中,实现下图的界面效果:
(2)将界面文件转换为Python文件。在eric6里运行对应的MainWinSignalSlog02.py,结果如下:
虽然这时界面已经做出来了,但是信号和槽没有连接,所以点击图中的button都没有任何反应。
(3)为了使窗口的显示和业务逻辑分离,再新建一个调用窗口显示的文件CallMainWinSignalSlog02.py,在调用类中添加多个自定义信号,并与槽函数进行绑定。然后运行该脚本,结果如下:
注意在运行CallMainWinSignalSlog02时引入的界面文件名字要与自己起的那个名字相同并且处于同一个package里。
6、多线程中信号与槽的使用
最简单的多线程使用方法是利用QThread函数,如下代码展示了QThread函数和信号与槽简单的结合方法。
""" | |
【简介】 | |
多线程信号槽通信示例 | |
""" | |
from PyQt5.QtWidgets import QApplication ,QWidget | |
from PyQt5.QtCore import QThread , pyqtSignal | |
import sys | |
class Main(QWidget): | |
def __init__(self, parent = None): | |
super(Main,self).__init__(parent) | |
# 创建一个线程实例并设置名称、变量、信号槽 | |
self.thread = MyThread() | |
self.thread.setIdentity("thread1") | |
self.thread.sinOut.connect(self.outText) | |
self.thread.setVal(6) | |
def outText(self,text): | |
print(text) | |
class MyThread(QThread): | |
sinOut = pyqtSignal(str) | |
def __init__(self,parent=None): | |
super(MyThread,self).__init__(parent) | |
self.identity = None | |
def setIdentity(self,text): | |
self.identity = text | |
def setVal(self,val): | |
self.times = int(val) | |
#执行线程的run方法 | |
self.start() | |
def run(self): | |
while self.times > 0 and self.identity: | |
# 发射信号 | |
self.sinOut.emit(self.identity+"==>"+str(self.times)) | |
self.times -= 1 | |
if __name__ == '__main__': | |
app = QApplication(sys.argv) | |
main = Main() | |
main.show() | |
sys.exit(app.exec_()) |
运行结果:
有时在开发程序时经常会执行一些耗时操作,这样就会导致界面卡顿,为了解决这个问题,就可以使用多线程,使用主线程更新界面,使用子线程实时处理数据,最后将结果显示到界面上。
如下的例子是定义了一个后台线程类BackendThread来模拟后台耗时操作,在这个线程类中定义了信号update_date。使用BackendThread线程类在后台处理数据,每秒发射依次自定义信号update_date。在初始化窗口界面时,定义后台线程类BackendThread,并把线程类的信号update_date连接到槽函数handleDisply()。这样后台线程每发射一次信号,就可以把最新的时间值实时显示在前台窗口的QLineEdit文本对话框中。完整代码如下:
""" | |
【简介】 | |
多线程更新跟新数据,pyqt5界面实时刷新例子 | |
""" | |
from PyQt5.QtCore import QThread , pyqtSignal, QDateTime | |
from PyQt5.QtWidgets import QApplication, QDialog, QLineEdit | |
import time | |
import sys | |
class BackendThread(QThread): | |
# 通过类成员对象定义信号对象 | |
update_date = pyqtSignal(str) | |