亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5結(jié)合Qt Designer創(chuàng)建信號(hào)與槽的詳細(xì)方法與實(shí)例

 更新時(shí)間:2020年03月08日 13:59:11   作者:jia666666  
這篇文章主要介紹了python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5結(jié)合Qt Designer創(chuàng)建信號(hào)與槽的詳細(xì)方法與實(shí)例,需要的朋友可以參考下

在下面這3篇文章中我們給出了手工輸入代碼的信號(hào)與槽的使用方法,因?yàn)椴捎眠@種方法介紹時(shí),會(huì)簡(jiǎn)單一些,如果使用Qt Designer來(lái)介紹這些功能,那么任何一個(gè)簡(jiǎn)單的功能都會(huì)使用xxxx.ui xxxx.py call_xxxx.py三個(gè)文件 來(lái)實(shí)現(xiàn),這樣內(nèi)容會(huì)顯得很亂

python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5信號(hào)與槽基礎(chǔ)使用方法與實(shí)例

python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5信號(hào)與槽的高級(jí)使用技巧(自定義信號(hào)與槽)詳解與實(shí)例

python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5信號(hào)與槽的高級(jí)使用技巧裝飾器信號(hào)與槽詳細(xì)使用方法與實(shí)例

在實(shí)戰(zhàn)應(yīng)用中,由于Qt Designer可以很好的實(shí)現(xiàn)界面顯示與業(yè)務(wù)邏輯分離,所有能保住我們解決大量的代碼,如果能夠使用Qt Designer自動(dòng)創(chuàng)建一些信號(hào)與槽機(jī)制,那就更好了。

本例要實(shí)現(xiàn)的功能是:通過(guò)一個(gè)模擬打印的界面來(lái)詳細(xì)說(shuō)明信號(hào)的使用,在打印時(shí),可以設(shè)置打印的份數(shù),紙張類型,觸發(fā)打印按鈕后,將執(zhí)行結(jié)果顯示在右側(cè),通過(guò)QCheckBox(全屏預(yù)覽 復(fù)選框)來(lái)選擇是否通過(guò)全屏模式進(jìn)行預(yù)覽,將執(zhí)行結(jié)果顯示在右側(cè)

按F1鍵可以顯示helpmessage幫助信息

第一步:Qt Designer

首先,使用Qt Designer新建一個(gè)模板名為widget的簡(jiǎn)單窗口,通過(guò)將widget box區(qū)域的控件拖曳到窗口中,實(shí)現(xiàn)如圖的界面效果

這里對(duì)窗口控件進(jìn)行簡(jiǎn)要說(shuō)明

控件類型 控件名稱 作用
QSpinBox numberSpinBox 顯示打印的分?jǐn)?shù)
QComboBox styleCombo 顯示打印的紙張類型,紙張類型包括A3,A4等
QPushButton printButton 連接emitPrintSiagnal函數(shù)的綁定,觸發(fā)自定義信號(hào)printSignal的發(fā)射
QCheckBox prievewState 是否全屏預(yù)覽
QPushButton priviewButton 連接emitPreviewSignal函數(shù)的綁定,觸發(fā)自定義信號(hào)previewSignal的發(fā)射
QLabel resultLabel 顯示執(zhí)行結(jié)果

第二步:將界面文件ui轉(zhuǎn)換為py文件

pyuic5 -o xxxxx.py xxxxx.ui

會(huì)在界面文件同級(jí)目錄下生成一個(gè)py文件

查看所生成的.py文件,完整代碼如下

# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'MainWinSignalSlog02.ui'
#
# Created by: PyQt5 UI code generator 5.8.1
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
  def setupUi(self, Form):
    Form.setObjectName("Form")
    Form.resize(715, 225)
    self.controlsGroup = QtWidgets.QGroupBox(Form)
    self.controlsGroup.setGeometry(QtCore.QRect(10, 20, 451, 151))
    self.controlsGroup.setObjectName("controlsGroup")
    self.widget = QtWidgets.QWidget(self.controlsGroup)
    self.widget.setGeometry(QtCore.QRect(10, 40, 411, 30))
    self.widget.setObjectName("widget")
    self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)
    self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
    self.horizontalLayout.setObjectName("horizontalLayout")
    self.label = QtWidgets.QLabel(self.widget)
    self.label.setObjectName("label")
    self.horizontalLayout.addWidget(self.label)
    self.numberSpinBox = QtWidgets.QSpinBox(self.widget)
    self.numberSpinBox.setObjectName("numberSpinBox")
    self.horizontalLayout.addWidget(self.numberSpinBox)
    self.styleCombo = QtWidgets.QComboBox(self.widget)
    self.styleCombo.setObjectName("styleCombo")
    self.styleCombo.addItem("")
    self.styleCombo.addItem("")
    self.styleCombo.addItem("")
    self.horizontalLayout.addWidget(self.styleCombo)
    self.label_2 = QtWidgets.QLabel(self.widget)
    self.label_2.setObjectName("label_2")
    self.horizontalLayout.addWidget(self.label_2)
    self.printButton = QtWidgets.QPushButton(self.widget)
    self.printButton.setObjectName("printButton")
    self.horizontalLayout.addWidget(self.printButton)
    self.widget1 = QtWidgets.QWidget(self.controlsGroup)
    self.widget1.setGeometry(QtCore.QRect(10, 100, 201, 30))
    self.widget1.setObjectName("widget1")
    self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.widget1)
    self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
    self.horizontalLayout_2.setObjectName("horizontalLayout_2")
    self.previewStatus = QtWidgets.QCheckBox(self.widget1)
    self.previewStatus.setObjectName("previewStatus")
    self.horizontalLayout_2.addWidget(self.previewStatus)
    self.previewButton = QtWidgets.QPushButton(self.widget1)
    self.previewButton.setObjectName("previewButton")
    self.horizontalLayout_2.addWidget(self.previewButton)
    self.resultGroup = QtWidgets.QGroupBox(Form)
    self.resultGroup.setGeometry(QtCore.QRect(470, 20, 231, 151))
    self.resultGroup.setObjectName("resultGroup")
    self.resultLabel = QtWidgets.QLabel(self.resultGroup)
    self.resultLabel.setGeometry(QtCore.QRect(20, 30, 191, 101))
    self.resultLabel.setObjectName("resultLabel")
    self.retranslateUi(Form)
    QtCore.QMetaObject.connectSlotsByName(Form)
  def retranslateUi(self, Form):
    _translate = QtCore.QCoreApplication.translate
    Form.setWindowTitle(_translate("Form", "打印控件"))
    self.controlsGroup.setTitle(_translate("Form", "打印控制"))
    self.label.setText(_translate("Form", "打印份數(shù):"))
    self.styleCombo.setItemText(0, _translate("Form", "A3"))
    self.styleCombo.setItemText(1, _translate("Form", "A4"))
    self.styleCombo.setItemText(2, _translate("Form", "A5"))
    self.label_2.setText(_translate("Form", "紙張類型:"))
    self.printButton.setText(_translate("Form", "打印"))
    self.previewStatus.setText(_translate("Form", "全屏預(yù)覽"))
    self.previewButton.setText(_translate("Form", "預(yù)覽"))
    self.resultGroup.setTitle(_translate("Form", "操作結(jié)果"))
    self.resultLabel.setText(_translate("Form", "<html><head/><body><p><br/></p></body></html>"))

第三步:新建調(diào)用窗口

為了使窗口的顯示與業(yè)務(wù)邏輯分離,在建一個(gè)調(diào)用窗口顯示的文件,在調(diào)用類中添加多個(gè)自定義信號(hào),并與槽函數(shù)進(jìn)行綁定,其完整代碼如下

# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from jia_07 import Ui_Form
from PyQt5.QtCore import pyqtSignal, Qt
class MyMainWindow(QMainWindow, Ui_Form):
  helpSignal = pyqtSignal(str)
  printSignal = pyqtSignal(list)
  # 聲明一個(gè)多重載版本的信號(hào),包括了一個(gè)帶int和str類型參數(shù)的信號(hào),以及帶str參數(shù)的信號(hào)
  previewSignal = pyqtSignal([ int, str ], [ str ])
  def __init__( self, parent=None ):
    super(MyMainWindow, self).__init__(parent)
    self.setupUi(self)
    self.initUI()
  def initUI( self ):
    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)
  # 發(fā)射預(yù)覽信號(hào)
  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ā)射打印信號(hào)
  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("打印: " + "份數(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)
    # 重載點(diǎn)擊鍵盤(pán)事件
  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)
  win = MyMainWindow()
  win.show()
  sys.exit(app.exec_())

運(yùn)行程序,顯示效果如圖

代碼分析

在上面的例子中,通過(guò)PyQtSignal()定義了三個(gè)信號(hào),一個(gè)str參數(shù)類型的信號(hào),一個(gè)list類型參數(shù)類型的信號(hào),一個(gè)多重載版本的信號(hào),包括一個(gè)int和str類型參數(shù)的信號(hào),以及帶str類型參數(shù)的信號(hào)

    helpSignal = pyqtSignal(str)

    printSignal = pyqtSignal(list)

    # 聲明一個(gè)多重載版本的信號(hào),包括了一個(gè)帶int和str類型參數(shù)的信號(hào),以及帶str參數(shù)的信號(hào)

    previewSignal = pyqtSignal([ int, str ], [ str ])

對(duì)于綁定信號(hào)與槽,這里著重說(shuō)明多重版本的信號(hào)綁定,prieviewSignal有兩個(gè)版本,即previewSignal(str)和prievewSignal(int ,str),由于兩個(gè)版本,因此在綁定的時(shí)候,需要顯示指定信號(hào)與槽的綁定

        self.helpSignal.connect(self.showHelpMessage)

        self.printSignal.connect(self.printPaper)

        self.previewSignal[ str ].connect(self.previewPaper)

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

在Qt的機(jī)制中,根據(jù)所傳遞信號(hào)的參數(shù)類型和個(gè)數(shù),連接到不同的槽函數(shù)

    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ā)射可以傳遞python數(shù)據(jù)類型的參數(shù),本例中的printSignal信號(hào)可以傳遞list類型的參數(shù)plist

 def emitPrintSignal( self ):

        pList = [ ]

        pList.append(self.numberSpinBox.value())

        pList.append(self.styleCombo.currentText())

        self.printSignal.emit(pList)

通過(guò)復(fù)寫(xiě)KeyPressEvent()方法,對(duì)F1鍵進(jìn)行功能擴(kuò)展,這里通過(guò)復(fù)寫(xiě)keyPressEvent()方法模擬發(fā)射所需的信號(hào),來(lái)完成對(duì)應(yīng)的任務(wù)

  def keyPressEvent( self, event ):

        if event.key() == Qt.Key_F1:

          self.helpSignal.emit("help message")

本文主要講解了PyQt5結(jié)合Qt Designer創(chuàng)建信號(hào)與槽的詳細(xì)方法與實(shí)例,另外一篇關(guān)于PyQt5結(jié)合Qt Designer創(chuàng)建信號(hào)與槽的文章 python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5信號(hào)與槽基本操作 大家也可以結(jié)合閱讀下,更多關(guān)于 PyQt5信號(hào)與槽的知識(shí)請(qǐng)查看下面的相關(guān)鏈接

相關(guān)文章

最新評(píng)論