Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将信号连接到插槽产生(nullptr)::插槽()错误_Python_Pyqt5_Qt5_Signals - Fatal编程技术网

Python 将信号连接到插槽产生(nullptr)::插槽()错误

Python 将信号连接到插槽产生(nullptr)::插槽()错误,python,pyqt5,qt5,signals,Python,Pyqt5,Qt5,Signals,我想将一个信号从我的定制QWidget类(WidgetClass)连接到DerivedController的插槽。 我尝试在实例化这两个类之后连接信号 但是,connect()语句出现以下错误: QObject::connect: Cannot connect WidgetClass::mySignal(double) to (nullptr)::mySlot(double) 我不太清楚为什么会这样。如果我理解正确,您只能将信号连接到类实例之间的插槽。 下面是我所写内容的一个伪实现(它在ipy

我想将一个信号从我的定制QWidget类(WidgetClass)连接到DerivedController的插槽。 我尝试在实例化这两个类之后连接信号

但是,connect()语句出现以下错误:

QObject::connect: Cannot connect WidgetClass::mySignal(double) to (nullptr)::mySlot(double)
我不太清楚为什么会这样。如果我理解正确,您只能将信号连接到类实例之间的插槽。 下面是我所写内容的一个伪实现(它在ipython中产生相同的错误):


我发现以下部分是错误的:

self.widget1.mySignal.connect(
    self.mySlot)
self.widget2.mySignal.connect(
    self.mySlot)
并应改写为:

self.widget1.mySignal.connect(
    DerivedController.mySlot)
self.widget2.mySignal.connect(
    DerivedController.mySlot)
这似乎解决了问题。
我认为这是因为我们没有绑定到实例的插槽,而是绑定到类本身的插槽,就像声明为类定义一部分的信号,而不是类实例化(我希望这是有意义的)。

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

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

综上所述,不再获取问题的错误信息,但仍存在其他问题:

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

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

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

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


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

    return controller


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


if __name__ == "__main__":
    main()
从PyQt5.QtCore导入pyqtSlot、pyqtSignal、QObject
从PyQt5.QtWidgets导入QApplication,QWidget
类BaseController(QObject):
定义初始化(self、widget1、widget2):
super()。\uuuu init\uuuuu()
self.widget1=widget1
self.widget2=widget2
#@pyqtlot(浮动)
def mySlot(自我、价值):
打印(f“基类得到{value}.”)
类DerivedController(BaseController):
定义初始化(self、widget1、widget2):
super()。\uuuuu init\uuuuu(widget1,widget2)
@pyqtSlot(浮动)
def mySlot(自我、价值):
#super().mySlot(值)
打印(f“派生类得到{value}!”)
def_设置连接(自):
self.widget1.mySignal.connect(self.mySlot)
self.widget2.mySignal.connect(self.mySlot)
类WidgetClass(QWidget):
mySignal=pyqtSignal(浮点)
def排放信号(自身):
self.mySignal.emit(1.8)
def myfunc():
w1=WidgetClass()
w2=WidgetClass()
控制器=衍生控制器(w1,w2)
控制器。_setupConnections()
controller.widget1.emitSignal()
返回控制器
def main():
app=QApplication([“测试”])
控制器=myfunc()
返回app.exec()
如果名称=“\uuuuu main\uuuuuuuu”:
main()

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

您忘记了
super()。\uuu init\uuuu()
在我的实际程序中调用
BaseController

,我实际上并没有从QObject继承,它是从“object”继承的一个基本python类。因此出现了错误。您需要从QObject继承来使用信号。你的问题解决了吗?谢谢,我相信这才是真正的问题。我的问题解决了。我简化了示例代码。控制器实例实际上是另一个类(QDialog)的成员,在我的例子中,它从未真正超出范围。
from PyQt5.QtCore import pyqtSlot, pyqtSignal, QObject
from PyQt5.QtWidgets import QApplication, QWidget


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

    return controller


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


if __name__ == "__main__":
    main()