PyQt5 坑 = list()

信号槽

文档

  1. btn clicked 事件的槽函数被调用两次的 bug
    以下代码定义了一个connectSlotsByName 槽函数,是对 pushButton1 这个 btn 的 clicked 事件进行捕获
def on_pushButton1_clicked(self):
    print("btn clicked")

按道理,应该每次点击 pushButton1 的时候,它会被调用一次。
事实是,它会被调用两次。
原因是 connectSlotsByName 按照名字匹配,所以 pushButton 有多个同名的 clicked 信号,都会发送,导致槽函数多次被调用。

stack overflow 回答

So your issue comes from the fact that clicked signal of a QPushButton has two overloads. Since Qt can connect signals to slots with less arguments, connectSlotsByName can successfully connect both overloads to your slot, thus calling the slot twice for each click.

解决:用 PyQt 信号槽 pyqtSlot 装饰器的进行重载,指定槽函数的签名(参数表),这样就可以

@pyqtSlot(bool)
def on_pushButton1_clicked(self, para):
  print("btn clicked", para)
#或者
@pyqtSlot()
def on_pushButton1_clicked(self):
  print("btn clicked")

线程

  1. 非主线程操作 GUI 控件导致 crash
    qt 智能在主线程(UI线程)进行UI操作, 在其他线程需要操作UI,要通过 信号槽机制来触发。

在 paho mqtt 回调函数中操作ui控件,导致crash,因为mqtt loop_start 启动了后台线程,回调函数是在后台线程中被调用的

你可能感兴趣的:(PyQt5 坑 = list())