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

pyqt5自定義信號(hào)實(shí)例解析

 更新時(shí)間:2018年01月31日 10:21:39   作者:追逐陽(yáng)光的風(fēng)  
這篇文章主要介紹了pyqt5自定義信號(hào)實(shí)例解析,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下

本文研究的主要是pyqt5自定義信號(hào)實(shí)例解析的相關(guān)內(nèi)容,具體介紹如下。

PyQt5已經(jīng)自動(dòng)定義了很多QT內(nèi)建的信號(hào)。但是在實(shí)際的使用中為了靈活使用信號(hào)與槽機(jī)制,我們可以根據(jù)需要自定義signal??梢允褂胮yqtSignal()方法定義新的信號(hào),新的信號(hào)作為類(lèi)的屬性。

自定義signal說(shuō)明:

pyqtSignal()方法原型(PyQt官網(wǎng)的定義):

PyQt5.QtCore.pyqtSignal(types[, name[, revision=0[, arguments=[]]]])
Create one or more overloaded unbound signals as a class attribute.

Parameters:
types – the types that define the C++ signature of the signal. Each type may be a Python type object or a string that is the name of a C++ type. Alternatively each may be a sequence of type arguments. In this case each sequence defines the signature of a different signal overload. The first overload will be the default.

name – the name of the signal. If it is omitted then the name of the class attribute is used. This may only be given as a keyword argument.

revision – the revision of the signal that is exported to QML. This may only be given as a keyword argument.

arguments – the sequence of the names of the signal's arguments that is exported to QML. This may only be given as a keyword argument.
Return type: an unbound signal

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

通過(guò)下面的例子,了解一下關(guān)于signal的定義:

from PyQt5.QtCore import QObject, pyqtSignal

class NewSignal(QObject):

  # 定義了一個(gè)“closed”信號(hào),該信號(hào)沒(méi)有參數(shù)據(jù)
  closed= pyqtSignal()

  # 定義了一個(gè)"range_changed"信號(hào),該信號(hào)有兩個(gè)int類(lèi)型的參數(shù)
  range_changed = pyqtSignal(int, int, name='rangeChanged')

自定義信號(hào)的發(fā)射,通過(guò)emit()方法類(lèi)實(shí)現(xiàn),具體參見(jiàn)該函數(shù)的原型:

emit(*args)
Parameters: args – the optional sequence of arguments to pass to any connected slots.

通過(guò)下面的例子,了解一下關(guān)于emit()的使用:

from PyQt5.QtCore import QObject, pyqtSignal

class NewSignal(QObject):

  # 一個(gè)valueChanged的信號(hào),該信號(hào)沒(méi)有參數(shù).
  valueChanged = pyqtSignal()

  def connect_and_emit_valueChanged(self):
    # 綁定信號(hào)和槽函數(shù)
    self.valueChanged.connect(self.handle_valueChanged)

    # 發(fā)射信號(hào).
    self.trigger.emit()

  def handle_valueChanged(self):
    print("trigger signal received")

示例說(shuō)明:

自定義信號(hào)的一般流程如下:

1、定義信號(hào)
2、定義槽函數(shù)
3、綁定信號(hào)和槽
4、發(fā)射信號(hào)

通過(guò)代碼示例來(lái)了解一下信號(hào)的自定義過(guò)程:

#-*- coding:utf-8 -*-
'''
defined Signal
'''
__author__ = 'Tony Zhu'
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)
  #聲明一個(gè)多重載版本的信號(hào),包括了一個(gè)帶int和str類(lèi)型參數(shù)的信號(hào),以及帶str參數(shù)的信號(hào)
  previewSignal = pyqtSignal([int,str],[str])
  def __init__(self):
    super().__init__()    
    self.initUI()


  def initUI(self):      

    self.creatContorls("打印控制:")
    self.creatResult("操作結(jié)果:")

    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("預(yù)覽")
    numberLabel = QLabel("打印份數(shù):")
    pageLabel = QLabel("紙張類(lèi)型:")
    self.previewStatus = QCheckBox("全屏預(yù)覽")
    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: "+"份數(shù):"+ 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_())

運(yùn)行該函數(shù)之后的效果如下:

示例說(shuō)明:

通過(guò)一個(gè)模擬打印的界面來(lái)詳細(xì)說(shuō)明一下關(guān)于信號(hào)的自定義,在打印的時(shí)候可以設(shè)定打印的分?jǐn)?shù),紙張類(lèi)型,觸發(fā)“打印”按鈕之后,將執(zhí)行結(jié)果顯示到右側(cè);通過(guò)全屏預(yù)覽QCheckBox來(lái)選擇是否通過(guò)全屏模式進(jìn)行預(yù)覽,將執(zhí)行結(jié)果顯示到右側(cè)。
通過(guò)點(diǎn)擊F1快捷鍵,可以顯示helpMessage信息。

代碼分析:

L12~15:

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

通過(guò)pyqtSignal()定義了三個(gè)信號(hào),helpSignal ,printSignal ,previewSignal 。其中:

helpSignal 為str參數(shù)類(lèi)型的信號(hào);

printSignal 為list參數(shù)類(lèi)型的信號(hào);

previewSignal為一個(gè)多重載版本的信號(hào),包括了一個(gè)帶int和str類(lèi)型參數(shù)的信號(hào),以及str類(lèi)行的參數(shù)。

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)

綁定信號(hào)和槽;著重說(shuō)明一下多重載版本的信號(hào)的綁定,previewSignal有兩個(gè)版本previewSignal(str),previewSignal(int,str)。由于存在兩個(gè)版本,從因此在綁定的時(shí)候需要顯式的指定信號(hào)和槽的綁定關(guān)系。

具體如下:

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

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

L72~76:

  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")

多重載版本的信號(hào)的發(fā)射也需要制定對(duì)應(yīng)發(fā)射的版本,類(lèi)似同信號(hào)的版定。

L78~82:

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

如代碼中所示,在信號(hào)發(fā)射的時(shí)候可以傳遞python數(shù)據(jù)類(lèi)型的參數(shù),在本例中傳遞list類(lèi)型的參數(shù)pList.

L93~96:

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

通過(guò)復(fù)寫(xiě)keyPressEvent()方法,將F1快捷鍵進(jìn)行功能的拓展。在windows的大部分應(yīng)用,我們都會(huì)使用一些快捷鍵來(lái)快速的完成某些特定的功能。比如F1鍵,會(huì)快速調(diào)出幫助界面。那我們就可以復(fù)寫(xiě)keyPressEvent()方法來(lái)模擬發(fā)送所需的信號(hào),來(lái)完成我們的對(duì)應(yīng)任務(wù).

注意事項(xiàng):

1、自定義的信號(hào)在init()函數(shù)之前定義;
2、自定義型號(hào)可以傳遞,str、int、list、object、float、tuple、dict等很多類(lèi)型的參數(shù);
3、注意signal和slot的調(diào)用邏輯,避免signal和slot之間出現(xiàn)死循環(huán)。如在slot方法中繼續(xù)發(fā)射該信號(hào);

總結(jié)

以上就是本文關(guān)于pyqt5自定義信號(hào)實(shí)例解析的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專(zhuān)題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!

相關(guān)文章

  • 淺談Python接口對(duì)json串的處理方法

    淺談Python接口對(duì)json串的處理方法

    今天小編就為大家分享一篇淺談Python接口對(duì)json串的處理方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • Python使用Scrapy爬取妹子圖

    Python使用Scrapy爬取妹子圖

    前面我們給大家介紹了使用nodejs來(lái)爬取妹紙圖片的方法,下面我們來(lái)看下使用Python是如何實(shí)現(xiàn)的呢,有需要的小伙伴參考下吧。
    2015-05-05
  • python matplotlib實(shí)現(xiàn)坐標(biāo)投影的示例代碼

    python matplotlib實(shí)現(xiàn)坐標(biāo)投影的示例代碼

    這篇文章主要為大家詳細(xì)介紹了python matplotlib實(shí)現(xiàn)坐標(biāo)投影,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • PyQt5多線程防卡死和多窗口用法的實(shí)現(xiàn)

    PyQt5多線程防卡死和多窗口用法的實(shí)現(xiàn)

    這篇文章主要介紹了PyQt5多線程防卡死和多窗口用法的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • python實(shí)現(xiàn)機(jī)械分詞之逆向最大匹配算法代碼示例

    python實(shí)現(xiàn)機(jī)械分詞之逆向最大匹配算法代碼示例

    這篇文章主要介紹了python實(shí)現(xiàn)機(jī)械分詞之逆向最大匹配算法代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • Python測(cè)試網(wǎng)絡(luò)連通性示例【基于ping】

    Python測(cè)試網(wǎng)絡(luò)連通性示例【基于ping】

    這篇文章主要介紹了Python測(cè)試網(wǎng)絡(luò)連通性,結(jié)合實(shí)例形式分析了Python通過(guò)發(fā)送ping請(qǐng)求測(cè)試網(wǎng)絡(luò)連通性相關(guān)操作技巧,需要的朋友可以參考下
    2018-08-08
  • 如何Tkinter模塊編寫(xiě)Python圖形界面

    如何Tkinter模塊編寫(xiě)Python圖形界面

    本文講解為何使用Tkinter而非PyQt,創(chuàng)建一個(gè)基本的Tkinter程序,模塊化Tkinter程序,希望對(duì)大家有幫助。
    2020-10-10
  • OpenCV學(xué)習(xí)之圖像的疊加與混合詳解

    OpenCV學(xué)習(xí)之圖像的疊加與混合詳解

    這篇文章主要為大家詳細(xì)介紹了OpenCV圖像視覺(jué)學(xué)習(xí)中的圖像的疊加與混合,文中的示例代碼簡(jiǎn)潔易懂,具有一定的借鑒價(jià)值,需要的可以參考一下
    2023-02-02
  • Python運(yùn)行DLL文件的方法

    Python運(yùn)行DLL文件的方法

    這篇文章主要介紹了Python運(yùn)行DLL文件的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 淺析PEP570新語(yǔ)法: 只接受位置參數(shù)

    淺析PEP570新語(yǔ)法: 只接受位置參數(shù)

    本文通過(guò)一個(gè)例子給大家介紹了PEP570新語(yǔ)法: 只接受位置參數(shù)的一些知識(shí),感興趣的朋友跟隨小編一起看看吧
    2019-10-10

最新評(píng)論

陇西县| 安宁市| 卢湾区| 永城市| 桂林市| 太保市| 镇康县| 定安县| 巴林右旗| 彝良县| 常宁市| 阜康市| 赤壁市| 阿城市| 丹凤县| 内丘县| 乌审旗| 五河县| 宜宾市| 台中县| 三河市| 平凉市| 鄂伦春自治旗| 濉溪县| 晋中市| 黄陵县| 石首市| 涞水县| 江永县| 榆社县| 南平市| 正镶白旗| 壤塘县| 衡山县| 镇坪县| 丹棱县| 罗江县| 尚志市| 金乡县| 固原市| 梁山县|