09.PyQt5信号与槽part2-------PyQt5编程开发

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)
   
 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值