我想将一个信号从我的定制QWidget类(WidgetClass)连接到DerivedController的插槽。 我尝试在实例化这两个类之后连接信号
但是,connect()语句出现以下错误:
QObject::connect: Cannot connect WidgetClass::mySignal(double) to (nullptr)::mySlot(double)
我不太清楚为什么会这样。如果我理解正确,您只能将信号连接到类实例之间的插槽。 下面是我所写内容的一个伪实现(它在ipython中产生相同的错误):
from PyQt5.QtCore import pyqtSlot, pyqtSignal, QObject
from PyQt5.QtWidgets import QApplication, QWidget
class BaseController():
def __init__(self, widget1, widget2):
self.widget1 = widget1
self.widget2 = widget2
#@pyqtSlot(float)
def mySlot(self, value):
print(f"BaseClass got {value}.")
class DerivedController(BaseController):
def __init__(self, widget1, widget2):
super().__init__(widget1, widget2)
@pyqtSlot(float)
def mySlot(self, value):
#super().mySlot(value)
print(f"Derived class got {value}!")
def _setupConnections(self):
self.widget1.mySignal.connect(
self.mySlot)
self.widget2.mySignal.connect(
self.mySlot)
class WidgetClass(QWidget):
mySignal = pyqtSignal(float)
def emitSignal(self):
self.mySignal.emit(1.8)
def myfunc():
w1 = WidgetClass()
w2 = WidgetClass()
controller = DerivedController(w1, w2)
controller._setupConnections()
controller.widget1.emitSignal()
def main():
app = QApplication(["test"])
return app.exec(myfunc())
if __name__ == "__main__":
main()
您忘记了在
BaseController
中调用super().__init__()
我发现以下部分是错误的:
并应改写为:
这似乎解决了问题。 我认为这是因为我们没有绑定到实例的槽,而是绑定到类本身的槽,就像作为类定义的一部分声明的信号,而不是类实例化(我希望这是有意义的)
OP提出的解决方案不正确,因为错误原因不同:
如果从类p继承,则必须调用类p的构造函数,在这种情况下,从QObject继承的BaseController不会调用QObject的构造函数
综上所述,不再获取问题的错误信息,但仍存在其他问题:
函数的范围是有限的,在该函数中创建的对象在执行该函数时会被销毁,在这种情况下,“控制器”会被销毁,并可能导致问题
另一方面,QApplicationExec()方法不应接收任何参数
考虑到上述情况,解决方案是:
另一方面,OP在其回答中指出:我认为这是因为我们没有绑定到实例的槽,但是类本身的槽是假的,连接是对象之间的
相关问题 更多 >
编程相关推荐