網站首頁 編程語言 正文
開發應用程序時,若只有一個窗口則只需關心這個窗口里面的各控件之間如何傳遞數據。如果程序有多個窗口,就要關心不同的窗口之間是如何傳遞數據。
單一窗口數據傳遞
對于單一窗口的程序來說,一個控件的變化會影響另一個控件的變化通過信號與槽的機制就可簡單解決。
import sys
from PyQt5.QtWidgets import QWidget, QLCDNumber, QSlider, QVBoxLayout, QApplication
from PyQt5.QtCore import Qt
class WinForm(QWidget):
def __init__(self, parent=None):
super(WinForm, self).__init__(parent)
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)
# valueChanged()是QSlider的一個信號函數,只要slider的值發生改變,就會發射一個信號
# 然后通過connect連接信號的接收控件lcd
slider.valueChanged.connect(lcd.display)
# lcd.setBinMode()
# lcd.setHexMode()
# lcd.setDecMode()
# lcd.setOctMode()
# lcd.setNumDigits(2)
# lcd.setDigitCount(4)
# lcd.setSegmentStyle(QLCDNumber.Filled)
self.setGeometry(300, 300, 350, 150)
self.setWindowTitle("信號與槽:連接滑塊LCD")
if __name__ == "__main__":
app = QApplication(sys.argv)
win = WinForm()
win.show()
sys.exit(app.exec_())
多窗口數據傳遞:調用屬性
DateDialog.py
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("DataDialog")
# 在布局中添加控件
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()
# 使用靜態函數創建對話框并返回(date, time, accepted)
@staticmethod
def getDateTime(parent=None):
dialog = DateDialog(parent)
result = dialog.exec_()
date = dialog.dateTime()
return (date.date(), date.time(), result == QDialog.Accepted)
CallDialogMainWin.py
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from DateDialog 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.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' % str(result))
if __name__ == "__main__":
app = QApplication(sys.argv)
win = WinForm()
win.show()
sys.exit(app.exec_())
多窗口數據傳遞:信號與槽
子窗口發射信號,父窗口接收信號。
DateDialog2.py
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_eimt = QDateTimeEdit(self)
self.datetime_eimt.setCalendarPopup(True)
self.datetime_eimt.setDateTime(QDateTime.currentDateTime())
layout.addWidget(self.label)
layout.addWidget(self.datetime_inner)
layout.addWidget(self.datetime_eimt)
# 使用兩個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_eimt.dateTimeChanged.connect(self.emit_signal)
def emit_signal(self):
date_str = self.datetime_eimt.dateTime().toString()
self.Signal_OneParameter.emit(date_str)
CallDialogMainWin2.py
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from DateDialog2 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):
print(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_())
原文鏈接:https://blog.csdn.net/songyulong8888/article/details/128113883
相關推薦
- 2022-05-13 Flutter開發之——getX-GetPage中間件(11)
- 2022-02-07 SecureCRT連Linux服務器,提示The remote system refused the
- 2022-12-21 Kotlin掛起函數應用介紹_Android
- 2024-01-16 關于jquery中的ajax 網絡異常失敗回調函數
- 2022-06-19 Rainbond使用Dockerfile構建便捷應用運行流程_云其它
- 2022-04-03 Android?App應用退到后臺顯示通知的實現方法_Android
- 2022-11-27 C++常見的stl容器與相關操作?示例解析_C 語言
- 2022-11-06 在Centos7中使用vscode和gdb調試PG插件的方法_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支