最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python PyQt5學習之自定義信號

 更新時間:2022年03月02日 10:31:53   作者:Yunlord  
PyQ5已經自動定義了很多QT自建的信號。但是在實際的使用中為了靈活使用信號與槽機制,可以根據需要自定義信號。本文就將為大家詳細講講PyQt5自定義信號,感興趣的可以了解一下

PyQ5已經自動定義了很多QT自建的信號。但是在實際的使用中為了靈活使用信號與槽機制,可以根據需要自定義信號。通過使用pyqtSignal()方法定義新的信號,新的信號作為類的屬性。

自定義signal說明:

新的信號應該定義在QObject的子類中。新的信號必須作為定義類的一部分,不允許將信號作為類的屬性在類定義之后通過動態(tài)的方式進行添加。通過這種方式新的信號才能自動的添加到QMetaObject類中。這就意味這新定義的信號將會出現在Qt Designer,并且可以通過QMetaObject API實現內省。

自定義信號的發(fā)射,通過emit()方法類實現

自定義信號的一般流程如下:

  1. 定義信號
  2. 定義槽函數
  3. 綁定信號和槽
  4. 發(fā)射信號

代碼示例

import sys
from PyQt5.QtCore import pyqtSignal, QObject, Qt, pyqtSlot
from PyQt5.QtWidgets import QWidget, QApplication, QGroupBox, QPushButton, QLabel, QCheckBox, QSpinBox, QHBoxLayout, QComboBox, QGridLayout
 
 
class SignalEmit(QWidget):
    helpSignal = pyqtSignal(str)
    printSignal = pyqtSignal(list)
    #聲明一個多重載版本的信號,包括了一個帶int和str類型參數的信號,以及帶str參數的信號
    previewSignal = pyqtSignal([int,str],[str])
    def __init__(self):
        super().__init__()        
        self.initUI()
 
 
    def initUI(self):           
 
        self.creatContorls("打印控制:")
        self.creatResult("操作結果:")
 
        layout = QHBoxLayout()
        layout.addWidget(self.controlsGroup)
        layout.addWidget(self.resultGroup)
        self.setLayout(layout)
 
        self.helpSignal.connect(self.showHelpMessage)
        self.printSignal.connect(self.printPaper)
        self.previewSignal[str].connect(self.previewPaper)
        self.previewSignal[int,str].connect(self.previewPaperWithArgs)  
        self.printButton.clicked.connect(self.emitPrintSignal)
        self.previewButton.clicked.connect(self.emitPreviewSignal)
 
        self.setGeometry(300, 300, 290, 150)
        self.setWindowTitle('defined signal')
        self.show()
 
    def creatContorls(self,title):
        self.controlsGroup = QGroupBox(title)
        self.printButton = QPushButton("打印")
        self.previewButton  = QPushButton("預覽")
        numberLabel = QLabel("打印份數:")
        pageLabel = QLabel("紙張類型:")
        self.previewStatus = QCheckBox("全屏預覽")
        self.numberSpinBox = QSpinBox()
        self.numberSpinBox.setRange(1, 100)
        self.styleCombo = QComboBox(self)
        self.styleCombo.addItem("A4")
        self.styleCombo.addItem("A5")
 
        controlsLayout = QGridLayout()
        controlsLayout.addWidget(numberLabel, 0, 0)
        controlsLayout.addWidget(self.numberSpinBox, 0, 1)
        controlsLayout.addWidget(pageLabel, 0, 2)
        controlsLayout.addWidget(self.styleCombo, 0, 3)
        controlsLayout.addWidget(self.printButton, 0, 4)
        controlsLayout.addWidget(self.previewStatus, 3, 0)
        controlsLayout.addWidget(self.previewButton, 3, 1)
        self.controlsGroup.setLayout(controlsLayout)
 
    def creatResult(self,title):
        self.resultGroup = QGroupBox(title)
        self.resultLabel = QLabel("")
        layout = QHBoxLayout()
        layout.addWidget(self.resultLabel)
        self.resultGroup.setLayout(layout)
 
    def emitPreviewSignal(self):
        if self.previewStatus.isChecked() == True:
            self.previewSignal[int,str].emit(1080," Full Screen")
        elif self.previewStatus.isChecked() == False:
            self.previewSignal[str].emit("Preview")
 
    def emitPrintSignal(self):
        pList = []
        pList.append(self.numberSpinBox.value ())
        pList.append(self.styleCombo.currentText())
        self.printSignal.emit(pList)
 
    def printPaper(self,list):
        self.resultLabel.setText("Print: "+"份數:"+ str(list[0]) +"  紙張:"+str(list[1]))
 
    def previewPaperWithArgs(self,style,text):
        self.resultLabel.setText(str(style)+text)
 
    def previewPaper(self,text):
        self.resultLabel.setText(text)          
 
    def keyPressEvent(self, event):
 
        if event.key() == Qt.Key_F1:
            self.helpSignal.emit("help message")
 
    def showHelpMessage(self,message):
        self.resultLabel.setText(message)
        #self.statusBar().showMessage(message)
 
 
if __name__ == '__main__':
 
    app = QApplication(sys.argv)
    dispatch = SignalEmit()
    sys.exit(app.exec_())

樣例說明:

通過一個模擬打印的界面來詳細說明一下關于信號的自定義,在打印的時候可以設定打印的分數,紙張類型,觸發(fā)“打印”按鈕之后,將執(zhí)行結果顯示到右側;通過全屏預覽QCheckBox來選擇是否通過全屏模式進行預覽,將執(zhí)行結果顯示到右側。

通過點擊F1快捷鍵,可以顯示helpMessage信息。

界面分析:

該界面主要由兩個部分組成:一個是打印控制,另一個是操作結果。

通過QHBoxLayout組合起來,如下所示:

layout = QHBoxLayout()
layout.addWidget(self.controlsGroup)
layout.addWidget(self.resultGroup)
self.setLayout(layout)

然后通過creatContorls定義“打印控制”界面,

def creatContorls(self,title):
    self.controlsGroup = QGroupBox(title)
    self.printButton = QPushButton("打印")
    self.previewButton  = QPushButton("預覽")
    numberLabel = QLabel("打印份數:")
    pageLabel = QLabel("紙張類型:")
    self.previewStatus = QCheckBox("全屏預覽")
    self.numberSpinBox = QSpinBox()
    self.numberSpinBox.setRange(1, 100)
    self.styleCombo = QComboBox(self)
    self.styleCombo.addItem("A4")
    self.styleCombo.addItem("A5")
 
    controlsLayout = QGridLayout()
    controlsLayout.addWidget(numberLabel, 0, 0)
    controlsLayout.addWidget(self.numberSpinBox, 0, 1)
    controlsLayout.addWidget(pageLabel, 0, 2)
    controlsLayout.addWidget(self.styleCombo, 0, 3)
    controlsLayout.addWidget(self.printButton, 0, 4)
    controlsLayout.addWidget(self.previewStatus, 3, 0)
    controlsLayout.addWidget(self.previewButton, 3, 1)
    self.controlsGroup.setLayout(controlsLayout)

QSpinBox是一個計數器控件,允許用戶選擇一個整數值通過單擊向上向下或者按鍵盤上的上下鍵來增加減少當前顯示的值,當然用戶也可以輸入值。

QComboBox是一個集按鈕和下拉選項于一體的控件,也稱做下拉列表框。

 然后通過creatResult定義“操作結果”界面:

def creatResult(self,title):
        self.resultGroup = QGroupBox(title)
        self.resultLabel = QLabel("")
        layout = QHBoxLayout()
        layout.addWidget(self.resultLabel)
        self.resultGroup.setLayout(layout)

代碼分析:

helpSignal = pyqtSignal(str)
printSignal = pyqtSignal(list)
#聲明一個多重載版本的信號,包括了一個帶int和str類型參數的信號,以及帶str參數的信號
previewSignal = pyqtSignal([int,str],[str])

通過pyqtSignal()定義了三個信號,helpSignal,printSignal,previewSignal。其中:

  • helpSignal 為str參數類型的信號。
  • printSignal 為list參數類型的信號。
  • previewSignal為一個多重載版本的信號,包括了一個帶int和str類型參數的信號,以及str類行的參數。
self.helpSignal.connect(self.showHelpMessage)
self.printSignal.connect(self.printPaper)
self.previewSignal[str].connect(self.previewPaper)
self.previewSignal[int,str].connect(self.previewPaperWithArgs)  
self.printButton.clicked.connect(self.emitPrintSignal)
self.previewButton.clicked.connect(self.emitPreviewSignal)

綁定信號和槽。

著重說明一下多重載版本的信號的綁定,previewSignal有兩個版本previewSignal(str),previewSignal(int,str)。由于存在兩個版本,從因此在綁定的時候需要顯式的指定信號和槽的綁定關系。

具體如下:

self.previewSignal[str].connect(self.previewPaper) self.previewSignal[int,str].connect(self.previewPaperWithArgs)

其中[str]參數的previewSignal信號綁定previewPaper();[int,str]的previewSignal信號綁定previewPaperWithArgs()

def emitPreviewSignal(self):
        if self.previewStatus.isChecked() == True:
            self.previewSignal[int,str].emit(1080," Full Screen")
        elif self.previewStatus.isChecked() == False:
            self.previewSignal[str].emit("Preview")

多重載版本的信號的發(fā)射也需要制定對應發(fā)射的版本,類似同信號的版定。

def emitPrintSignal(self):
        pList = []
        pList.append(self.numberSpinBox.value ())
        pList.append(self.styleCombo.currentText())
        self.printSignal.emit(pList)

如代碼中所示,在信號發(fā)射的時候可以傳遞python數據類型的參數,在本例中傳遞list類型的參數pList。

def keyPressEvent(self, event):
    if event.key() == Qt.Key_F1:
         self.helpSignal.emit("help message")

通過復寫keyPressEvent()方法,將F1快捷鍵進行功能的拓展。在windows的大部分應用,我們都會使用一些快捷鍵來快速的完成某些特定的功能。比如F1鍵,會快速調出幫助界面,那就可以復寫keyPressEvent()方法來模擬發(fā)送所需的信號,來完成對應任務。

注意事項:

1.自定義的信號在init()函數之前定義

2.自定義型號可以傳遞,str、int、list、object、float、tuple、dict等很多類型的參數

3.注意signal和slot的調用邏輯,避免signal和slot之間出現死循環(huán)。如在slot方法中繼續(xù)發(fā)射該信號

到此這篇關于Python PyQt5學習之自定義信號的文章就介紹到這了,更多相關Python PyQt5信號內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python FFT合成波形的實例

    Python FFT合成波形的實例

    今天小編大家分享一篇Python FFT合成波形的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python實現合并兩個字典的8種方法

    Python實現合并兩個字典的8種方法

    Python有多種方法可以通過使用各種函數和構造函數來合并字典,本文主要介紹了Python實現合并兩個字典的8種方法,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • 自己編程中遇到的Python錯誤和解決方法匯總整理

    自己編程中遇到的Python錯誤和解決方法匯總整理

    這篇文章主要介紹了自己編程中遇到的Python錯誤和解決方法匯總整理,本文收集整理了較多的案例,需要的朋友可以參考下
    2015-06-06
  • Python實現指定數組下標值正序與倒序排序算法功能舉例

    Python實現指定數組下標值正序與倒序排序算法功能舉例

    在程序中,經常需要按數組倒序或反序重新排列數組,下面這篇文章主要給大家介紹了關于Python實現指定數組下標值正序與倒序排序算法功能的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • 數據庫連接池DBUtils的安裝使用方法

    數據庫連接池DBUtils的安裝使用方法

    DBUtils是Python的一個用于實現數據庫連接池的模塊,這篇文章主要介紹了數據庫連接池DBUtils的安裝使用方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-03-03
  • Python實現合并帶有嵌入圖片的單元格

    Python實現合并帶有嵌入圖片的單元格

    這篇文章主要為大家詳細介紹了如何使用Python實現合并帶有嵌入圖片的單元格,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-12-12
  • Python?Diagrams創(chuàng)建高質量圖表和流程圖實例探究

    Python?Diagrams創(chuàng)建高質量圖表和流程圖實例探究

    Python?Diagrams是一個強大的Python庫,使創(chuàng)建這些圖表變得簡單且靈活,本文將深入介紹Python?Diagrams,包括其基本概念、安裝方法、示例代碼以及一些高級用法,以幫助大家充分利用這一工具來創(chuàng)建令人印象深刻的圖表
    2024-01-01
  • 詳解Python OpenCV圖像分割算法的實現

    詳解Python OpenCV圖像分割算法的實現

    圖像分割是指根據灰度、色彩、空間紋理、幾何形狀等特征把圖像劃分成若干個互不相交的區(qū)域。本文就來和大家聊聊OpenCV的圖像分割算法及基于輪廓的字符分離,感興趣的可以了解一下
    2022-08-08
  • Pycharm 解決自動格式化沖突的設置操作

    Pycharm 解決自動格式化沖突的設置操作

    這篇文章主要介紹了Pycharm 解決自動格式化沖突的設置操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 樹莓派極簡安裝OpenCv的方法步驟

    樹莓派極簡安裝OpenCv的方法步驟

    這篇文章主要介紹了樹莓派極簡安裝OpenCv的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10

最新評論

大安市| 台南县| 博湖县| 右玉县| 普宁市| 襄城县| 桐柏县| 枣庄市| 三穗县| 榆中县| 山西省| 千阳县| 隆德县| 永顺县| 陈巴尔虎旗| 上犹县| 南昌市| 沿河| 海口市| 上饶市| 平阳县| 旅游| 扶绥县| 台安县| 潼关县| 抚远县| 佛教| 常德市| 定西市| 焦作市| 西和县| 浑源县| 原阳县| 普安县| 浮山县| 宁国市| 游戏| 介休市| 杭州市| 丰城市| 陆良县|