日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

python GUI庫圖形界面開發之PyQt5結合Qt Designer創建信號與槽的詳細方法與實例

瀏覽:34日期:2022-08-03 13:17:37

在下面這3篇文章中我們給出了手工輸入代碼的信號與槽的使用方法,因為采用這種方法介紹時,會簡單一些,如果使用Qt Designer來介紹這些功能,那么任何一個簡單的功能都會使用xxxx.ui xxxx.py call_xxxx.py三個文件 來實現,這樣內容會顯得很亂

python GUI庫圖形界面開發之PyQt5信號與槽基礎使用方法與實例

python GUI庫圖形界面開發之PyQt5信號與槽的高級使用技巧(自定義信號與槽)詳解與實例

python GUI庫圖形界面開發之PyQt5信號與槽的高級使用技巧裝飾器信號與槽詳細使用方法與實例

在實戰應用中,由于Qt Designer可以很好的實現界面顯示與業務邏輯分離,所有能保住我們解決大量的代碼,如果能夠使用Qt Designer自動創建一些信號與槽機制,那就更好了。

本例要實現的功能是:通過一個模擬打印的界面來詳細說明信號的使用,在打印時,可以設置打印的份數,紙張類型,觸發打印按鈕后,將執行結果顯示在右側,通過QCheckBox(全屏預覽 復選框)來選擇是否通過全屏模式進行預覽,將執行結果顯示在右側

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

第一步:Qt Designer

首先,使用Qt Designer新建一個模板名為widget的簡單窗口,通過將widget box區域的控件拖曳到窗口中,實現如圖的界面效果

python GUI庫圖形界面開發之PyQt5結合Qt Designer創建信號與槽的詳細方法與實例

這里對窗口控件進行簡要說明

控件類型 控件名稱 作用 QSpinBox numberSpinBox 顯示打印的分數 QComboBox styleCombo 顯示打印的紙張類型,紙張類型包括A3,A4等 QPushButton printButton 連接emitPrintSiagnal函數的綁定,觸發自定義信號printSignal的發射 QCheckBox prievewState 是否全屏預覽 QPushButton priviewButton 連接emitPreviewSignal函數的綁定,觸發自定義信號previewSignal的發射 QLabel resultLabel 顯示執行結果 第二步:將界面文件ui轉換為py文件

pyuic5 -o xxxxx.py xxxxx.ui

會在界面文件同級目錄下生成一個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, QtWidgetsclass 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', '打印份數:')) 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', '全屏預覽')) self.previewButton.setText(_translate('Form', '預覽')) self.resultGroup.setTitle(_translate('Form', '操作結果')) self.resultLabel.setText(_translate('Form', '<html><head/><body><p><br/></p></body></html>'))第三步:新建調用窗口

為了使窗口的顯示與業務邏輯分離,在建一個調用窗口顯示的文件,在調用類中添加多個自定義信號,并與槽函數進行綁定,其完整代碼如下

# -*- coding: utf-8 -*-import sysfrom PyQt5.QtWidgets import QApplication, QMainWindowfrom jia_07 import Ui_Formfrom PyQt5.QtCore import pyqtSignal, Qtclass MyMainWindow(QMainWindow, Ui_Form): helpSignal = pyqtSignal(str) printSignal = pyqtSignal(list) # 聲明一個多重載版本的信號,包括了一個帶int和str類型參數的信號,以及帶str參數的信號 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) # 發射預覽信號 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('打印: ' + '份數:' + 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) win = MyMainWindow() win.show() sys.exit(app.exec_())

運行程序,顯示效果如圖

python GUI庫圖形界面開發之PyQt5結合Qt Designer創建信號與槽的詳細方法與實例

代碼分析

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

    helpSignal = pyqtSignal(str)

    printSignal = pyqtSignal(list)

    # 聲明一個多重載版本的信號,包括了一個帶int和str類型參數的信號,以及帶str參數的信號

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

對于綁定信號與槽,這里著重說明多重版本的信號綁定,prieviewSignal有兩個版本,即previewSignal(str)和prievewSignal(int ,str),由于兩個版本,因此在綁定的時候,需要顯示指定信號與槽的綁定

        self.helpSignal.connect(self.showHelpMessage)

        self.printSignal.connect(self.printPaper)

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

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

在Qt的機制中,根據所傳遞信號的參數類型和個數,連接到不同的槽函數

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

信號發射可以傳遞python數據類型的參數,本例中的printSignal信號可以傳遞list類型的參數plist

 def emitPrintSignal( self ):

        pList = [ ]

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

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

        self.printSignal.emit(pList)

通過復寫KeyPressEvent()方法,對F1鍵進行功能擴展,這里通過復寫keyPressEvent()方法模擬發射所需的信號,來完成對應的任務

  def keyPressEvent( self, event ):

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

          self.helpSignal.emit('help message')

本文主要講解了PyQt5結合Qt Designer創建信號與槽的詳細方法與實例,另外一篇關于PyQt5結合Qt Designer創建信號與槽的文章 python GUI庫圖形界面開發之PyQt5信號與槽基本操作 大家也可以結合閱讀下,更多關于 PyQt5信號與槽的知識請查看下面的相關鏈接

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲va久久久噜噜噜久久| 亚洲综合小说| 国产精品成人3p一区二区三区| 欧美日韩亚洲一区三区| 国产欧美日韩一区二区三区四区| 国产精品亚洲成在人线| 欧美黑人做爰爽爽爽| 欧美日韩一区二区三区四区在线观看 | 国产精品一卡| 国产精品大片免费观看| 精品理论电影在线| 日韩成人免费| 91超碰国产精品| 在线观看视频免费一区二区三区| 日韩国产一二三区| 精品国产欧美日韩| 欧美精品一区二区三区精品| 亚洲精品系列| 国产精品a级| 亚洲香蕉网站| 欧美日本三区| 久久久久午夜电影| 日韩欧美中文字幕电影 | 亚洲综合二区| 欧美日韩网址| 欧美freesex黑人又粗又大| 中国女人久久久| 欧美日韩中文| 91精品国产91久久久久久黑人| 免费在线观看精品| 国产精品久久久网站| 999久久久91| 欧美日韩亚洲三区| 亚洲高清av| 欧美久久久网站| 国产伊人精品| 麻豆免费精品视频| 鲁大师成人一区二区三区| 国产亚洲精品美女久久| 欧美精选视频一区二区| 日韩极品在线观看| 欧美va天堂在线| 国产精品v亚洲精品v日韩精品| 久久中文字幕av| 国产日韩一区二区三区在线播放| 另类中文字幕国产精品| 欧美伊人久久| 99视频精品免费观看| 老司机精品视频在线播放| 蜜芽一区二区三区| 欧美亚洲精品在线| 久久精品五月| 日韩黄色免费网站| 中文久久精品| 成人精品亚洲| 精品视频一区二区三区在线观看 | 久久影院一区| 精品一区二区三区免费看| 蜜臀久久99精品久久久久久9| 国产成人精品一区二区三区视频 | 视频在线观看一区二区三区| 国产一区二区久久久久| 日韩中文字幕一区二区高清99| 麻豆精品蜜桃| 精品一级视频| 国产精品永久| 视频一区中文字幕精品| 中文一区二区| 国产一区二区三区自拍| 久久99高清| 国产毛片一区二区三区 | 亚洲男女av一区二区| 日本久久黄色| 国产高清亚洲| 国产精品毛片视频| 国产调教一区二区三区| 亚洲人亚洲人色久| 蜜臀av性久久久久蜜臀aⅴ流畅 | 亚洲成人三区| 91精品国产91久久久久久黑人| 精品久久久网| 成人在线免费观看网站| 麻豆高清免费国产一区| 久久97视频| 国产一区二区三区久久| 国产精品.xx视频.xxtv| 国产欧美自拍一区| 国产美女久久| 久久久国产精品入口麻豆| 国产麻豆一区二区三区精品视频| 69堂免费精品视频在线播放| 亚洲香蕉久久| 日本亚洲三级在线| 日韩精品免费视频人成| 日本99精品| 日韩高清不卡一区| 欧美日韩一区二区三区四区在线观看| 欧美日韩一区二区三区不卡视频 | 久久夜夜操妹子| 视频福利一区| 亚洲手机视频| 欧美一区二区三区高清视频| 高清久久一区| 在线看片福利| 91青青国产在线观看精品| 高清日韩欧美| 精品视频黄色| 国产精品久久久久久久免费观看| 精品国产亚洲一区二区三区在线 | 成人精品天堂一区二区三区| 婷婷激情一区| 伊人精品视频| 久久亚洲不卡| 国产乱人伦精品一区| 久久久久久色 | 久久久久.com| 国产精品婷婷| 日韩制服丝袜先锋影音| 日本不卡中文字幕| 久久精品福利| 99久久夜色精品国产亚洲1000部| 亚洲主播在线| 国产精品一区三区在线观看| 中文在线а√天堂| 亚洲成人三区| 91精品国产自产精品男人的天堂 | 午夜久久美女| 日韩毛片网站| 日本一二区不卡| 激情综合网五月| 亚洲精品影视| 国模大尺度视频一区二区| 免费视频一区三区| 天堂av一区| 福利一区二区| 视频一区二区中文字幕| 国产欧美一区| 激情欧美丁香| 久久精品凹凸全集| 人人香蕉久久| 日韩国产精品久久久| 在线人成日本视频| 亚洲精品综合| 日韩国产一区| 亚洲精品系列| 香蕉视频亚洲一级| 欧美视频久久| 婷婷六月综合| 精品日本视频| 中文字幕一区二区三区四区久久| 麻豆久久久久久| 亚洲丝袜美腿一区| 日韩一区二区三区免费| 国产日韩欧美一区| 国产一级久久| 中文在线免费视频| 欧美欧美黄在线二区| 99热免费精品| 岛国av免费在线观看| 亚洲欧美一级| 国产综合色产| 国产精选在线| 欧美精品影院| 免费美女久久99| 久久久一二三| 久久久国产精品入口麻豆| 亚洲精品自拍| 欧美日韩免费观看一区=区三区| 久久久久97| 日本久久二区| 国产精品婷婷| 久久精品国产亚洲夜色av网站| 国产精品黄网站| 视频一区中文字幕精品| 久久久久久美女精品| 国产一区国产二区国产三区| 亚洲精品第一| 中文国产一区| 激情久久久久久久| 新版的欧美在线视频| 国产一区二区精品久| 国产精品a级| 久久国产视频网| 亚洲精品成人一区| 久久av在线| 欧美日韩四区| 欧美精选视频一区二区| 国产粉嫩在线观看| 麻豆精品在线观看| 只有精品亚洲| 国产精品视区| 樱桃成人精品视频在线播放| 色婷婷久久久| 久久久五月天| 久久国产中文字幕| 久久精品国产亚洲夜色av网站| 精精国产xxxx视频在线播放| 国产精品原创| 92国产精品| 亚洲精品在线影院|