pyqt5开发核心机制:信号与槽(Slot)

学习参考链接 https://www.jianshu.com/p/c61cd0d86a53

http://www.cainiaoxueyuan.com/bc/9621.html

    @pyqtSlot()

    def on_pushButton_clicked(self):

        print('1按钮被按下')

其中  @pyqtSlot() 为修饰器,为了区分不同触发的名字

修饰器可以不使用,一样可以识别,但是如果用户一旦使用请务必与触发的机制一一对应,如在传入值为int时,必须将修饰器写为如下:

@pyqtSlot("int")

否则不会有触发。

利用Qt中的ui文件生成PyQt5程序,自定义槽函数

用装饰器信号与槽

1、使用格式

@PyQt5.QtCore.pyqtSlot(参数)
def on_发送者对象名称_发射信号名称(self,参数):
 pass

2、注意点,使用装饰器必须定义两个东西

QMetaObject.connectSlotsByName(self)

给需要绑定事件的定义一个id(self.btn.setObjectName('名称'))

3、按钮的普通事件

...
class Window(QWidget):
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.setWindowTitle('装饰器信号与槽')
    self.resize(500, 500)
    self.move(400, 200)
    self.btn = QPushButton('按钮', self)
    self.init_ui()

  def init_ui(self):
    self.btn.clicked.connect(self.btn_hand)
    
  @staticmethod
  def btn_hand():
    print('使用connect点击了按钮')
...

4、使用装饰器后的事件

...
class Window(QWidget):
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.setWindowTitle('装饰器信号与槽')
    self.resize(500, 500)
    self.move(400, 200)
    self.btn = QPushButton('按钮', self)
    self.init_ui()
    # 要在加载组件后使用
    QMetaObject.connectSlotsByName(self)

  def init_ui(self):
  # 这个地方定义的名字直接在下面使用
    self.btn.setObjectName('btn')

  @pyqtSlot()
  def on_btn_clicked(self):
    print('使用装饰器点击了按钮')

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用QThread的信号机制来终止线程的运行。具体实现方式可以参考以下代码示例: ```python import sys import time from PyQt5 import QtCore, QtWidgets class Worker(QtCore.QObject): finished = QtCore.pyqtSignal() progress = QtCore.pyqtSignal(int) def __init__(self): super().__init__() @QtCore.pyqtSlot() def run(self): count = 0 while True: if count >= 100: self.finished.emit() break self.progress.emit(count) time.sleep(0.1) count += 1 class MainWindow(QtWidgets.QMainWindow): def __init__(self): super().__init__() self.thread = QtCore.QThread() self.worker = Worker() self.worker.moveToThread(self.thread) self.progress_bar = QtWidgets.QProgressBar() self.setCentralWidget(self.progress_bar) self.worker.finished.connect(self.thread.quit) self.worker.finished.connect(self.worker.deleteLater) self.thread.finished.connect(self.thread.deleteLater) self.worker.progress.connect(self.progress_bar.setValue) self.thread.started.connect(self.worker.run) self.thread.start() self.setWindowTitle("PyQt5 Thread Example") def closeEvent(self, event): self.worker.finished.emit() self.thread.quit() self.thread.wait() event.accept() if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) ``` 在上面的代码中,我们定义了一个Worker类,该类继承自QObject,其中包含了一个run函数,该函数会不断地发送进度信号,直到完成任务。我们还定义了一个MainWindow类,该类继承自QMainWindow,其中包含了一个进度条,可以显示任务的进度。在MainWindow的构造函数中,我们创建了一个QThread对象和一个Worker对象,并将Worker对象移动到QThread线程中。我们还将Worker类的信号连接起来,以便在Worker运行时更新进度条。最后,我们启动了QThread线程,并在关闭窗口时终止了线程的运行。 在上述代码中,我们并没有显示地终止线程的运行,而是通过发送finished信号来告诉线程任务已经完成。这种方式可以让线程在完成任务后自动退出,避免了线程无法退出的问题。如果需要立即终止线程的运行,可以在Worker类中添加一个停止标志,并在run函数中检查该标志。当需要终止线程时,设置该标志即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值