小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

PyQt信號(hào)與槽之信號(hào)與槽的高級(jí)用法(四)

 大傻子的文淵閣 2023-01-04 發(fā)布于浙江

裝飾器信號(hào)與槽

所謂裝飾器信號(hào)與槽,就是通過(guò)裝飾器的方法來(lái)定義信號(hào)與槽函數(shù),具體的使用方法如下

@PyQt5.QtCore.pyqtSlot(參數(shù))
def on_發(fā)送者對(duì)象名稱(chēng))發(fā)射信號(hào)名稱(chēng)(self,參數(shù)):
    pass

這種方法有效的前提是下面的函數(shù)已經(jīng)執(zhí)行:

QMetaObject.connectSlotsByName(QObject)

在上面的代碼中,'發(fā)送者對(duì)象名稱(chēng)’就是使用setObjectName函數(shù)設(shè)置的名稱(chēng),因此自定義槽函數(shù)的命名規(guī)則也可以看做:on+使用setObjectName設(shè)置的名稱(chēng)+信號(hào)名稱(chēng)
接下來(lái)是具體的實(shí)例

import sys
from PyQt5.QtWidgets import QApplication,QWidget,QHBoxLayout,QPushButton
from PyQt5 import QtCore

class CustWidget(QWidget):
    def __init__(self,parent=None):
        super(CustWidget, self).__init__(parent)

        #創(chuàng)建按鈕,添加到自身窗口中
        self.okButton=QPushButton('ok',self)
        #使用setObjectName設(shè)置對(duì)象名稱(chēng)
        self.okButton.setObjectName('okButton')

        #設(shè)置自身的布局為水平布局,并添加按鈕控件到其中
        layout=QHBoxLayout(self)
        layout.addWidget(self.okButton)


        #TODo 第一種方法
        #self.okButton.clicked.connect(self.okButton_clicked)

    #def okButton_clicked( self ):
    #   print('單擊了ok按鈕')

        #第二種方法
        QtCore.QMetaObject.connectSlotsByName(self)
    @QtCore.pyqtSlot()
    def on_okButton_clicked( self ):
        print('單擊了ok按鈕')
if __name__ == '__main__':
    app=QApplication(sys.argv)
    win=CustWidget()
    win.show()
    sys.exit(app.exec_())

運(yùn)行程序,顯示效果如圖,單擊ok按鈕,控制臺(tái)打印預(yù)期調(diào)試信息
這里寫(xiě)圖片描述

QtCore.QMetaObject.connectSlotsByName(self)

事實(shí)上,它是PyQt5中根據(jù)信號(hào)名稱(chēng)自動(dòng)連接到槽函數(shù)的核心代碼,這行代碼用來(lái)將QObject中的子孫對(duì)象的某些對(duì)象按照其objectName連接到相應(yīng)的槽函數(shù),舉個(gè)例子說(shuō)名一下
假設(shè)代碼QtCore.QMetaObject.connectSlotsByName(self)已經(jīng)執(zhí)行,則下面的代碼

  @QtCore.pyqtSlot()
    def on_okButton_clicked( self ):
        print('單擊了ok按鈕')

會(huì)被自動(dòng)識(shí)別為下面的代碼

def __init__(self,parent=None):
    self.okButton.clicked.connect(self.okButton_clicked)
def okButton_clicked(self):
        print('單擊了ok按鈕')

信號(hào)與槽的斷開(kāi)與連接

有時(shí)候基于某些原因,想要臨時(shí)或永久的斷開(kāi)某個(gè)信號(hào)與槽函數(shù)的連接,這就是要說(shuō)的內(nèi)容
一般把connect前面加上dis就是解除綁定的意思:即disconnect
實(shí)例如下

from PyQt5.QtCore import QObject,pyqtSignal

class SignalClass(QObject):
    #聲明無(wú)參數(shù)的信號(hào)
    signal1=pyqtSignal()
    #聲明帶一個(gè)int類(lèi)型參數(shù)的信號(hào)
    signal2=pyqtSignal(int)

    def __init__(self,parent=None):
        super(SignalClass, self).__init__(parent)
        #將signal1信號(hào)連接到兩個(gè)槽函數(shù)
        self.signal1.connect(self.sig1Call)
        self.signal1.connect(self.sig2Call)

        #將signal2信號(hào)連接到信號(hào)1
        self.signal2.connect(self.signal1)

        #發(fā)射信號(hào)
        self.signal1.emit()
        self.signal2.emit(1)

        #斷開(kāi)信號(hào)與槽函數(shù)的關(guān)系
        self.signal1.disconnect(self.sig1Call)
        self.signal1.disconnect(self.sig2Call)
        self.signal2.disconnect(self.signal1)

        #綁定信號(hào)與槽函數(shù)
        self.signal1.connect(self.sig1Call)
        self.signal2.connect(self.sig1Call)

        #信號(hào)發(fā)射
        self.signal1.emit()
        self.signal2.emit(1)
    #輸出信號(hào)1發(fā)射
    def sig1Call( self ):
        print('signal-1 emit')
    #輸出信號(hào)2發(fā)射
    def sig2Call( self ):

        print('signal-2 emit')
if __name__ == '__main__':
    signal=SignalClass()

運(yùn)行結(jié)果顯示如下
這里寫(xiě)圖片描述

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多