3 回答

TA貢獻1876條經驗 獲得超6個贊
OP提出的解決方案是不正確的,因為錯誤的原因是不同的:
如果您從類 P 繼承,那么您必須調用類 P 的構造函數,在您的情況下,從 QObject 繼承的 BaseController 不會調用 QObject 的構造函數。
綜合以上,題目的報錯信息不再獲取,但還有其他問題:
一個函數的作用域是有限的,在該函數內創建的對象在函數執行時被銷毀,在這種情況下“控制器”被銷毀,可能會導致問題。
另一方面,QApplication exec() 方法不應接收任何參數。
綜合以上,解決辦法是:
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()
另一方面,OP 在其回答中指出:我認為這是因為我們沒有綁定到實例的插槽,但類本身的插槽是假的,連接是對象之間的。

TA貢獻1809條經驗 獲得超8個贊
我發現以下部分是錯誤的:
self.widget1.mySignal.connect( self.mySlot) self.widget2.mySignal.connect( self.mySlot)
并且應該這樣重寫:
self.widget1.mySignal.connect( DerivedController.mySlot) self.widget2.mySignal.connect( DerivedController.mySlot)
這似乎解決了這個問題。我認為這是因為我們沒有綁定到實例的插槽,而是綁定到類本身的插槽,就像聲明為類定義的一部分的信號一樣,而不是類實例化(我希望這是有道理的)。
添加回答
舉報