日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Python Qt GUI设计:窗口之间数据传递(拓展篇—5)

發布時間:2023/11/27 生活经验 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python Qt GUI设计:窗口之间数据传递(拓展篇—5) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

1、單一窗口數據傳輸

2、多窗口數據傳輸:調用屬性

3、多窗口數據傳輸:信號與槽


在開發程序時,如果這個程序只有一個窗口,則應該關心這個窗口里面的各個控件之間是如何傳遞數據的。如果這個程序有多個窗口,那么還應該關心不同的窗口之間是如何傳遞數據的。

本篇博文首先給出一個例子,說明在一個窗口中不同控件之間的數據是如何傳遞的。對于多窗口的情況,一般有兩種解決方法:一種是主窗口獲取子窗口中控件的屬性,另一種是通過信號與槽機制,一般是子窗口通過發射信號的形式傳遞數據,主窗口的槽函數獲取這些數據。

1、單一窗口數據傳輸

對于具有單一窗口的程序來說,一個控件的變化會影響另一個控件的變化,這種變化利用信號與槽機制非常容易解決。

通過示例,了解單一窗口數據傳輸的方法,效果如下所示:

首先,創建滑塊和LCD控件,然后,通過QVBoxLayout設置布局,最后,連接QSlider控件的valueChanged()信號函數和LCD面板控件的display()槽函數。

valueChanged()是QSlider 的一個信號函數,只要 slider 的值發生改變,它就會發射一個信號。還可以設置參數控制信號在什么時候發射,然后通過connect連接信號的接收控件,也就是lcd。槽是對信號的響應,這里是lcd.display,即更新LCD面板的數字信息。

實現代碼如下所示:

import sys
from PyQt5.QtWidgets import QWidget,QLCDNumber,QSlider,QVBoxLayout,QApplication
from PyQt5.QtCore import Qtclass WinForm(QWidget):def __init__(self):super().__init__()   self.initUI()def initUI(self):#1 先創建滑塊和 LCD 部件lcd = QLCDNumber(self)slider = QSlider(Qt.Horizontal, self)#2 通過QVboxLayout來設置布局vBox = QVBoxLayout()vBox.addWidget(lcd)vBox.addWidget(slider)self.setLayout(vBox)#3 valueChanged()是Qslider的一個信號函數,只要slider的值發生改變,它就會發射一個信號,然后通過connect連接信號的接收部件,也就是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_())

2、多窗口數據傳輸:調用屬性

在PyQt編程過程中,經常會遇到輸入或選擇多個參數的問題。把多個參數寫到一個窗口中,主窗口會顯得很臃腫,所以一般是添加一個按鈕,調用對話框,在對話框中進行參數的選擇,關閉對話框時將參數值返回給主窗口。

PyQt提供了一些標準的對話框類,用于輸入數據、修改數據、更改應用的設置等,常見的有QFileDialog、QInputDialog、QColorDialog、QFontDialog等。

本小節將介紹不同窗口在自定義對話框之間通過屬性傳參。通過示例,了解屬性傳參的方法,效果如下所示:

示例中,在主窗口中調用對話框有兩種方法,單擊“彈出對話框"按鈕,在對話框的時間日期控件中選擇日期,則會把所選中的日期返回到主窗口的lineText文本框控件中。

使用兩個按鈕(Ok和Cancel)分別連接accept()和reject()槽函數。在類中定義一個靜態函數getDateTime(),該靜態函數返回3個時間值。原理是利用靜態函數的特性,在靜態函數中實例化 DateDialog 類,并調用dialog.exec_()函數來顯式執行對話框。通過 dialog.exec_()的返回值來判斷用戶單擊的是Ok按鈕還是Cancel按鈕,然后做出下一步判斷。

主窗口實現代碼如下所示:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from DateDialog import DateDialogclass 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.onButton1Click)self.button2 = QPushButton('彈出對話框2')self.button2.clicked.connect(self.onButton2Click)gridLayout = QGridLayout()gridLayout.addWidget(self.lineEdit)gridLayout.addWidget(self.button1)gridLayout.addWidget(self.button2)self.setLayout(gridLayout)def onButton1Click(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)dialog.destroy()def onButton2Click(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 result == QDialog.Accepted:print('點擊確認按鈕')else:print('點擊取消按鈕')if __name__ == "__main__":app = QApplication(sys.argv)form = WinForm()form.show()sys.exit(app.exec_())

對話框窗口實現代碼如下所示:

from PyQt5.QtCore import *
from PyQt5.QtGui 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)# 使用兩個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)# 從對話框中獲取當前日期和時間def dateTime(self):return self.datetime.dateTime()# 靜態方法創建對話框并返回 (date, time, accepted)@staticmethoddef getDateTime(parent=None):dialog = DateDialog(parent)result = dialog.exec_()date = dialog.dateTime()return (date.date(), date.time(), result == QDialog.Accepted)

3、多窗口數據傳輸:信號與槽

對于多窗口的數據傳遞,一般是通過子窗口發射信號的,主窗口通過槽函數捕獲這個信號,然后獲取信號里面的數據。子窗口發射的信號有兩種:其中一種是發射PyQt內置的一些信號,另一種是發射自定義的信號。

發射自定義信號的好處是,它的參數類型可以自定義。比如發射一個自定義信號,它的參數類型可以為int、str、dict、list等;如果發射內置信號,則只能是特定的幾個參數。

2、多窗口數據傳輸:調用屬性例子基礎上進行修改。

主窗口實現代碼如下所示:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from DateDialog2 import DateDialogclass 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_())

對話框窗口實現代碼如下所示:

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)

總結

以上是生活随笔為你收集整理的Python Qt GUI设计:窗口之间数据传递(拓展篇—5)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。