您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“python中GUI庫圖形界面開發之PyQt5信號與槽多窗口數據傳遞的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“python中GUI庫圖形界面開發之PyQt5信號與槽多窗口數據傳遞的示例分析”這篇文章吧。
在pyqt5編程過程中,經常會遇到輸入或選擇多個參數的問題,把多個參數寫到一個窗口中,主窗口會顯得很臃腫,所以,一般是添加一個按鈕,調用對話框,在對話框中進行參數的選擇,關閉對話框將參數返回給主窗口
pyqt提供了一些標準的對話框類,用于輸入數據,修改數據,更改應用的設置等,常見的有QFileDialog,QInputDialog,QColorDialog, QFontDialog等,在不同的窗口之間傳參數有兩種常用的方式,一種在自定義對話框之間通過屬性傳參,另一種在窗口之間使用信號與槽機制傳參,這里主要介紹第一種
單一窗口的數據傳遞實例
對于具有單一窗口的程序來說,一個控件的變化會影響另一個控件的變化,這中變化利用信號與槽的關系非常容易解決
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 ): #先創建水平滑塊和Lcd控件 lcd=QLCDNumber(self) slider=QSlider(Qt.Horizontal,self) #垂直布局,添加控件 vbox=QVBoxLayout() vbox.addWidget(lcd) vbox.addWidget(slider) #設置窗口布局 self.setLayout(vbox) #設置滑塊數值信號改變連接Lcd的更新 slider.valueChanged.connect(lcd.display) #設置初始位置以及初始大小,設置標題 self.setGeometry(300,300,350,150) self.setWindowTitle('信號與槽:連接滑塊LCd') if __name__ == '__main__': app=QApplication(sys.argv) form=WinForm() form.show() sys.exit(app.exec_())
運行效果如圖
新建對話框子窗口屬性,我這里的名字為: jia_13多窗口數據傳遞之調用屬性
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)
再新建一個主窗口文件,用來調用上一個子窗口
import sys from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5.QtWidgets import * from jia_13多窗口數據傳遞之調用屬性 import DateDialog class WinForm(QWidget): def __init__(self,parent=None): super(WinForm, self).__init__(parent) self.resize(400,90) self.setWindowTitle('對話框關閉時返回值給主窗口的例子') 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_())
運行程序,顯示如圖
在主窗口調用對話框有兩種方法,本例中,這兩種方法操作效果是一樣的,都需要點擊彈出對話框按鈕,在對話框的時間日期控件中選擇日期,則會把選中的日期返回到主窗口的lineTeXt文本控件中
第一中方法:直接在主窗口程序中實例化該對話框,然后調用該對話框的函數,來獲取返回值,根據對話框的返回值單擊確認按鈕還是取消按鈕來進行下一步的操作,同理,對于上面的DateDialog,主窗口程序代碼如下
def onButton1Clicked( self ):
dialog=DateDialog(self)
result=dialog.exec_()
date=dialog.dateTime()
self.lineEdit.setText(date.date().toString())
第二種方法:在主窗口程序中調用子窗口的靜態函數,實際上這種方法與第一種方法是一樣的,只不過他利用靜態函數的特點,在子窗口的靜態函數中的創建實例化對象
def onButton2Clicked( self ):
date,time,result=DateDialog.getDateTime()
self.lineEdit.setText(date.toString())
對于多窗口的數據傳遞,一般是通過子窗口發射信號的,主窗口通過槽函數捕獲這個信號,然后獲取信號里面的數據,子窗口發射的信號有兩種:一種是發射內置pyqt信號,一種是發射自定義的信號
發射自定義的信號,好處是它的參數可以自定義,可以為int list dict等各種類型與多個參數
新建一個子對話框文件,這里的名稱為: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('子窗口:用來發射信號') # 在布局中添加部件 layout = QVBoxLayout(self) self.label = QLabel(self) self.label.setText('前者發射內置信號\n后者發射自定義信號') 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()槽函數 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)
創建主窗口,調用對話框文件
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('信號與槽傳遞參數的示例') 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('接收子窗口內置信號的時間') 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) '''連接子窗口的內置信號與主窗口的槽函數''' dialog.datetime_inner.dateTimeChanged.connect(self.deal_inner_slot) '''連接子窗口的自定義信號與主窗口的槽函數''' 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_())
運行程序,效果如下
下面代碼表示,當空間datetime_emit的時間發生變化時,就會觸發,子窗口的槽函數emit_signal,而在這個槽函數中又會發射自定義信號Signal_OneParameter,這個信號函數是為了傳遞date_str參數給主函數
def emit_signal(self):
date_str = self.datetime_emit.dateTime().toString()
self.Signal_OneParameter.emit(date_str)
對于主窗口,關鍵是獲取子窗口的信號,并把它綁定在自己的槽函數上,這樣就實現了子窗口的控件與主窗口控件的綁定,核心代碼如下
def openDialog(self):
dialog = DateDialog(self)
'''連接子窗口的內置信號與主窗口的槽函數'''
dialog.datetime_inner.dateTimeChanged.connect(self.deal_inner_slot)
'''連接子窗口的自定義信號與主窗口的槽函數'''
dialog.Signal_OneParameter.connect(self.deal_emit_slot)
dialog.show()
以上是“python中GUI庫圖形界面開發之PyQt5信號與槽多窗口數據傳遞的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。