python GUI庫圖形界面開發(fā)之PyQt5信號與槽多窗口數(shù)據(jù)傳遞詳細(xì)使用方法與實例
在pyqt5編程過程中,經(jīng)常會遇到輸入或選擇多個參數(shù)的問題,把多個參數(shù)寫到一個窗口中,主窗口會顯得很臃腫,所以,一般是添加一個按鈕,調(diào)用對話框,在對話框中進行參數(shù)的選擇,關(guān)閉對話框?qū)?shù)返回給主窗口
pyqt提供了一些標(biāo)準(zhǔn)的對話框類,用于輸入數(shù)據(jù),修改數(shù)據(jù),更改應(yīng)用的設(shè)置等,常見的有QFileDialog,QInputDialog,QColorDialog, QFontDialog等,在不同的窗口之間傳參數(shù)有兩種常用的方式,一種在自定義對話框之間通過屬性傳參,另一種在窗口之間使用信號與槽機制傳參,這里主要介紹第一種
單一窗口的數(shù)據(jù)傳遞實例
對于具有單一窗口的程序來說,一個控件的變化會影響另一個控件的變化,這中變化利用信號與槽的關(guān)系非常容易解決
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class WinForm(QWidget):
def __init__(self):
super(WinForm, self).__init__()
self.initUI()
def initUI( self ):
#先創(chuàng)建水平滑塊和Lcd控件
lcd=QLCDNumber(self)
slider=QSlider(Qt.Horizontal,self)
#垂直布局,添加控件
vbox=QVBoxLayout()
vbox.addWidget(lcd)
vbox.addWidget(slider)
#設(shè)置窗口布局
self.setLayout(vbox)
#設(shè)置滑塊數(shù)值信號改變連接Lcd的更新
slider.valueChanged.connect(lcd.display)
#設(shè)置初始位置以及初始大小,設(shè)置標(biāo)題
self.setGeometry(300,300,350,150)
self.setWindowTitle('信號與槽:連接滑塊LCd')
if __name__ == '__main__':
app=QApplication(sys.argv)
form=WinForm()
form.show()
sys.exit(app.exec_())
運行效果如圖

多窗口數(shù)據(jù)傳遞:調(diào)用屬性
新建對話框子窗口屬性,我這里的名字為: jia_13多窗口數(shù)據(jù)傳遞之調(diào)用屬性
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class DateDialog(QDialog):
def __init__(self,parent=None):
super(DateDialog, self).__init__(parent)
self.setWindowTitle('DateDialog')
#在布局中添加控件
layout=QVBoxLayout(self)
self.datetime=QDateTimeEdit(self)
self.datetime.setCalendarPopup(True)
self.datetime.setDateTime(QDateTime.currentDateTime())
layout.addWidget(self.datetime)
buttons=QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel,Qt.Horizontal,self)
buttons.accepted.connect(self.accept)
buttons.rejected.connect(self.reject)
layout.addWidget(buttons)
def dateTime( self ):
return self.datetime.dateTime()
@staticmethod
def getDateTime(parent=None):
dialog=DateDialog(parent)
result=dialog.exec_()
date=dialog.dateTime()
return (date.date(),date.time(),result==QDialog.Accepted)
再新建一個主窗口文件,用來調(diào)用上一個子窗口
import sys
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from jia_13多窗口數(shù)據(jù)傳遞之調(diào)用屬性 import DateDialog
class WinForm(QWidget):
def __init__(self,parent=None):
super(WinForm, self).__init__(parent)
self.resize(400,90)
self.setWindowTitle('對話框關(guān)閉時返回值給主窗口的例子')
self.lineEdit=QLineEdit(self)
self.button1=QPushButton('彈出對話框1')
self.button1.clicked.connect(self.onButton1Clicked)
self.button2=QPushButton('彈出對話框2')
self.button2.clicked.connect(self.onButton2Clicked)
gridLayout=QGridLayout(self)
gridLayout.addWidget(self.lineEdit)
gridLayout.addWidget(self.button1)
gridLayout.addWidget(self.button2)
def onButton1Clicked( self ):
dialog=DateDialog(self)
result=dialog.exec_()
date=dialog.dateTime()
self.lineEdit.setText(date.date().toString())
print('\n日期對話框的返回值')
print('date=%s'%str(date.date))
print('time=%s'%str(date.time()))
print('result=%s'%result)
def onButton2Clicked( self ):
date,time,result=DateDialog.getDateTime()
self.lineEdit.setText(date.toString())
print('\n 日期對話框的返回值')
print('date=%s' %str(date))
print('time=%s' %str(time))
print('result=%s' %result)
if __name__ == '__main__':
app=QApplication(sys.argv)
form=WinForm()
form.show()
sys.exit(app.exec_())
運行程序,顯示如圖

代碼分析
在主窗口調(diào)用對話框有兩種方法,本例中,這兩種方法操作效果是一樣的,都需要點擊彈出對話框按鈕,在對話框的時間日期控件中選擇日期,則會把選中的日期返回到主窗口的lineTeXt文本控件中
第一中方法:直接在主窗口程序中實例化該對話框,然后調(diào)用該對話框的函數(shù),來獲取返回值,根據(jù)對話框的返回值單擊確認(rèn)按鈕還是取消按鈕來進行下一步的操作,同理,對于上面的DateDialog,主窗口程序代碼如下
def onButton1Clicked( self ):
dialog=DateDialog(self)
result=dialog.exec_()
date=dialog.dateTime()
self.lineEdit.setText(date.date().toString())
第二種方法:在主窗口程序中調(diào)用子窗口的靜態(tài)函數(shù),實際上這種方法與第一種方法是一樣的,只不過他利用靜態(tài)函數(shù)的特點,在子窗口的靜態(tài)函數(shù)中的創(chuàng)建實例化對象
def onButton2Clicked( self ):
date,time,result=DateDialog.getDateTime()
self.lineEdit.setText(date.toString())
多窗口數(shù)據(jù)傳遞信號與槽實例
對于多窗口的數(shù)據(jù)傳遞,一般是通過子窗口發(fā)射信號的,主窗口通過槽函數(shù)捕獲這個信號,然后獲取信號里面的數(shù)據(jù),子窗口發(fā)射的信號有兩種:一種是發(fā)射內(nèi)置pyqt信號,一種是發(fā)射自定義的信號
發(fā)射自定義的信號,好處是它的參數(shù)可以自定義,可以為int list dict等各種類型與多個參數(shù)
新建一個子對話框文件,這里的名稱為:jia_14多窗口信號傳遞之信號與槽
# -*- coding: utf-8 -*-
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class DateDialog(QDialog):
Signal_OneParameter = pyqtSignal(str)
def __init__(self, parent=None):
super(DateDialog, self).__init__(parent)
self.setWindowTitle('子窗口:用來發(fā)射信號')
# 在布局中添加部件
layout = QVBoxLayout(self)
self.label = QLabel(self)
self.label.setText('前者發(fā)射內(nèi)置信號\n后者發(fā)射自定義信號')
self.datetime_inner = QDateTimeEdit(self)
self.datetime_inner.setCalendarPopup(True)
self.datetime_inner.setDateTime(QDateTime.currentDateTime())
self.datetime_emit = QDateTimeEdit(self)
self.datetime_emit.setCalendarPopup(True)
self.datetime_emit.setDateTime(QDateTime.currentDateTime())
layout.addWidget(self.label)
layout.addWidget(self.datetime_inner)
layout.addWidget(self.datetime_emit)
# 使用兩個button(ok和cancel)分別連接accept()和reject()槽函數(shù)
buttons = QDialogButtonBox(
QDialogButtonBox.Ok | QDialogButtonBox.Cancel,
Qt.Horizontal, self)
buttons.accepted.connect(self.accept)
buttons.rejected.connect(self.reject)
layout.addWidget(buttons)
self.datetime_emit.dateTimeChanged.connect(self.emit_signal)
def emit_signal(self):
date_str = self.datetime_emit.dateTime().toString()
self.Signal_OneParameter.emit(date_str)
創(chuàng)建主窗口,調(diào)用對話框文件
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from jia_14多窗口信號傳遞之信號與槽 import DateDialog
class WinForm(QWidget):
def __init__(self, parent=None):
super(WinForm, self).__init__(parent)
self.resize(400, 90)
self.setWindowTitle('信號與槽傳遞參數(shù)的示例')
self.open_btn = QPushButton('獲取時間')
self.lineEdit_inner = QLineEdit(self)
self.lineEdit_emit = QLineEdit(self)
self.open_btn.clicked.connect(self.openDialog)
self.lineEdit_inner.setText('接收子窗口內(nèi)置信號的時間')
self.lineEdit_emit.setText('接收子窗口自定義信號的時間')
grid = QGridLayout()
grid.addWidget(self.lineEdit_inner)
grid.addWidget(self.lineEdit_emit)
grid.addWidget(self.open_btn)
self.setLayout(grid)
def openDialog(self):
dialog = DateDialog(self)
'''連接子窗口的內(nèi)置信號與主窗口的槽函數(shù)'''
dialog.datetime_inner.dateTimeChanged.connect(self.deal_inner_slot)
'''連接子窗口的自定義信號與主窗口的槽函數(shù)'''
dialog.Signal_OneParameter.connect(self.deal_emit_slot)
dialog.show()
def deal_inner_slot(self, date):
self.lineEdit_inner.setText(date.toString())
def deal_emit_slot(self, dateStr):
self.lineEdit_emit.setText(dateStr)
if __name__ == "__main__":
app = QApplication(sys.argv)
form = WinForm()
form.show()
sys.exit(app.exec_())
運行程序,效果如下

代碼分析
下面代碼表示,當(dāng)空間datetime_emit的時間發(fā)生變化時,就會觸發(fā),子窗口的槽函數(shù)emit_signal,而在這個槽函數(shù)中又會發(fā)射自定義信號Signal_OneParameter,這個信號函數(shù)是為了傳遞date_str參數(shù)給主函數(shù)
def emit_signal(self):
date_str = self.datetime_emit.dateTime().toString()
self.Signal_OneParameter.emit(date_str)
對于主窗口,關(guān)鍵是獲取子窗口的信號,并把它綁定在自己的槽函數(shù)上,這樣就實現(xiàn)了子窗口的控件與主窗口控件的綁定,核心代碼如下
def openDialog(self):
dialog = DateDialog(self)
'''連接子窗口的內(nèi)置信號與主窗口的槽函數(shù)'''
dialog.datetime_inner.dateTimeChanged.connect(self.deal_inner_slot)
'''連接子窗口的自定義信號與主窗口的槽函數(shù)'''
dialog.Signal_OneParameter.connect(self.deal_emit_slot)
dialog.show()
本文主要講解了PyQt5窗口數(shù)據(jù)傳遞與PyQt5信號與槽多窗口數(shù)據(jù)傳遞詳細(xì)使用方法與實例,更多關(guān)于PyQt5信號與槽的知識請查看下面的相關(guān)鏈接
相關(guān)文章
python實現(xiàn)各進制轉(zhuǎn)換的總結(jié)大全
這篇文章主要給大家總結(jié)了python實現(xiàn)各進制轉(zhuǎn)換的相關(guān)資料,其中包括字符串與十六進制轉(zhuǎn)換、內(nèi)置函數(shù)hex()與進制互轉(zhuǎn)等相關(guān)內(nèi)容,需要的朋友可以參考借鑒,下面來一起看看吧。2017-06-06
Deepsort + Yolo 實現(xiàn)行人檢測和軌跡追蹤的方法
用?Python?腳本實現(xiàn)電腦喚醒后自動拍照并截屏發(fā)郵件通知
Python入門教程(四十三)Python的NumPy數(shù)據(jù)類型
Python使用pydub實現(xiàn)M4A轉(zhuǎn)MP3轉(zhuǎn)換器
Python3實現(xiàn)的爬蟲爬取數(shù)據(jù)并存入mysql數(shù)據(jù)庫操作示例
零基礎(chǔ)使用Python讀寫處理Excel表格的方法

