3 回答

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超6個(gè)贊
OP提出的解決方案是不正確的,因?yàn)殄e(cuò)誤的原因是不同的:
如果您從類 P 繼承,那么您必須調(diào)用類 P 的構(gòu)造函數(shù),在您的情況下,從 QObject 繼承的 BaseController 不會(huì)調(diào)用 QObject 的構(gòu)造函數(shù)。
綜合以上,題目的報(bào)錯(cuò)信息不再獲取,但還有其他問(wèn)題:
一個(gè)函數(shù)的作用域是有限的,在該函數(shù)內(nèi)創(chuàng)建的對(duì)象在函數(shù)執(zhí)行時(shí)被銷毀,在這種情況下“控制器”被銷毀,可能會(huì)導(dǎo)致問(wèn)題。
另一方面,QApplication exec() 方法不應(yīng)接收任何參數(shù)。
綜合以上,解決辦法是:
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 在其回答中指出:我認(rèn)為這是因?yàn)槲覀儧](méi)有綁定到實(shí)例的插槽,但類本身的插槽是假的,連接是對(duì)象之間的。

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超6個(gè)贊
你忘了super().__init__()
打進(jìn)來(lái)的電話BaseController

TA貢獻(xiàn)1809條經(jīng)驗(yàn) 獲得超8個(gè)贊
我發(fā)現(xiàn)以下部分是錯(cuò)誤的:
self.widget1.mySignal.connect( self.mySlot) self.widget2.mySignal.connect( self.mySlot)
并且應(yīng)該這樣重寫(xiě):
self.widget1.mySignal.connect( DerivedController.mySlot) self.widget2.mySignal.connect( DerivedController.mySlot)
這似乎解決了這個(gè)問(wèn)題。我認(rèn)為這是因?yàn)槲覀儧](méi)有綁定到實(shí)例的插槽,而是綁定到類本身的插槽,就像聲明為類定義的一部分的信號(hào)一樣,而不是類實(shí)例化(我希望這是有道理的)。
添加回答
舉報(bào)