gpt4 book ai didi

python - 将信号连接到槽会产生 (nullptr)::slot() 错误

转载 作者:行者123 更新时间:2023-12-02 07:09:06 25 4
gpt4 key购买 nike

我想将信号从我的自定义 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()

最佳答案

OP提出的解决方案是不正确的,因为错误原因不同:

如果您从类 P 继承,则必须调用类 P 的构造函数,在您的情况下,从 QObject 继承的 BaseController 不会调用 QObject 的构造函数。

综合以上,不再获取问题的错误信息,但还有其他问题:

  • 函数的范围是有限的,并且在该函数内创建的对象在函数执行时会被销毁,在这种情况下“ Controller ”被销毁并可能导致问题。

  • 另一方面,QApplication exec() 方法不应接收任何参数。

考虑到上述情况,解决方案是:

from PyQt5.QtCore import pyqtSlot, pyqtSignal, QObject
from PyQt5.QtWidgets import QApplication, QWidget


class BaseController(QObject):
def __init__(self, widget1, widget2):
<b>super().__init__()</b>
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()

<b>return controller</b>


def main():
app = QApplication(["test"])
<b>controller = myfunc()
return app.exec()</b>


if __name__ == "__main__":
main()

另一方面,OP在其答案中指出:我认为这是因为我们没有绑定(bind)到实例的槽,而是类本身的槽是假的,连接是对象之间的。

关于python - 将信号连接到槽会产生 (nullptr)::slot() 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62291092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com