第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

將信號(hào)連接到插槽會(huì)產(chǎn)生 (nullptr)::slot() 錯(cuò)誤

將信號(hào)連接到插槽會(huì)產(chǎn)生 (nullptr)::slot() 錯(cuò)誤

暮色呼如 2023-01-04 11:31:56
我想將來(lái)自自定義 QWidget 類 (WidgetClass) 的信號(hào)連接到 DerivedController 的插槽。我在實(shí)例化兩個(gè)類后嘗試連接信號(hào)。但是,我在 connect() 語(yǔ)句中收到以下錯(cuò)誤:QObject::connect: Cannot connect WidgetClass::mySignal(double) to (nullptr)::mySlot(double)我不太清楚為什么會(huì)這樣。如果我理解正確,您只能將信號(hào)連接到類實(shí)例之間的插槽。下面是我正在編寫(xiě)的偽實(shí)現(xiàn)(它在 ipython 中產(chǎn)生相同的錯(cuò)誤):from PyQt5.QtCore import pyqtSlot, pyqtSignal, QObjectfrom PyQt5.QtWidgets import QApplication, QWidgetclass 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()
查看完整描述

3 回答

?
HUX布斯

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ì)象之間的。


查看完整回答
反對(duì) 回復(fù) 2023-01-04
?
墨色風(fēng)雨

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超6個(gè)贊

你忘了super().__init__()打進(jìn)來(lái)的電話BaseController



查看完整回答
反對(duì) 回復(fù) 2023-01-04
?
海綿寶寶撒

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í)例化(我希望這是有道理的)。


查看完整回答
反對(duì) 回復(fù) 2023-01-04
  • 3 回答
  • 0 關(guān)注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)