目錄
一.多視窗互動(1):不使用信號與槽
二.多視窗互動(2):使用信號與槽
一.多視窗互動(1):不使用信號與槽
所謂的互動就是資料的傳遞,不使用信號與槽就是強耦合的方式,即兩個視窗之間相互呼叫控制元件,
代碼:
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,相當于 self.setLayout(layout),而且上面的parent必須有
layout=QVBoxLayout(self)
'''
QDateTimeEdit是一個允許用戶編輯日期時間的控制元件,可以使用鍵盤上的上下鍵頭按鈕來增加或減少日期的時間值,
QDateTimeEdit通過setDisplayFormat()函式來設定顯示的日期時間格式
'''
#日期時間輸入框
self.datetime=QDateTimeEdit(self)
#print(isinstance(datetime,DateDialog))
#popup (n.) 彈出;彈跳裝置;發射
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)
#reject (v.)拒絕
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()
#print('date.date():',date.date()) #日期:年月日
#print('date.time():',date.time())#時間:時分秒
#第三個引數是:是否點擊了ok
return (date.date(),date.time(),result==QDialog.Accepted)
MutilWindow1.py
import sys
from pyqt.windows.DateDialog import * #強耦合
class MutilWindow1(QWidget):
def __init__(self):
super(MutilWindow1, self).__init__()
self.setWindowTitle('多視窗互動(1):不使用信號與槽')
#單行輸入
self.lineEdit=QLineEdit(self)
self.btn1=QPushButton('彈出對話框1')
self.btn1.clicked.connect(self.onButton1Click)
self.btn2 = QPushButton('彈出對話框2')
self.btn2.clicked.connect(self.onButton2Click)
#柵格布局
gridLayout=QGridLayout()
gridLayout.addWidget(self.lineEdit)
gridLayout.addWidget(self.btn1)
gridLayout.addWidget(self.btn2)
self.setLayout(gridLayout)
def onButton1Click(self):
dialog=DateDialog(self)
result=dialog.exec_()
date=dialog.dateTime()
self.lineEdit.setText(date.date().toString())
#銷毀視窗
dialog.destroy()
def onButton2Click(self):
date,time,result=DateDialog.getDateTime()
self.lineEdit.setText(date.toString())
if result == QDialog.Accepted:
print('點擊確定按鈕')
else:
print('點擊取消按鈕')
if __name__=='__main__':
app=QApplication(sys.argv)
main=MutilWindow1()
main.show()
sys.exit(app.exec_())
運行結果:

二.多視窗互動(2):使用信號與槽
低耦合:
如果一個視窗A與另一個視窗B互動,那么A盡量不要直接訪問B視窗中的控制元件,
應該在視窗A中訪問B視窗中的信號,并指定與信號系結的槽函式
例:如果A直接訪問B視窗的控制元件,一旦B視窗控制元件發生改變,那么A和B的代碼都需要變化
如果A訪問的是B中的信號,那么B中的控制元件發生了改變,只需要修改B中的代碼即可,信號就是為此而生
代碼:
NewDateDialog.py
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class NewDateDialog(QDialog):
#定義一個信號,有一個字串型的引數
Signal_OneParameter = pyqtSignal(str)
def __init__(self, parent=None):
super(NewDateDialog, 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()
print(date_str)
#發出信號
self.Signal_OneParameter.emit(date_str)
MutilWindow2.py
import sys
from pyqt.SignalAndSlot.windows.NewDateDialog import *
class MultiWindow2(QWidget):
def __init__(self, parent=None):
super(MultiWindow2, self).__init__(parent)
self.resize(400, 90)
self.setWindowTitle('多視窗互動(2):使用信號與槽')
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 = NewDateDialog(self)
#dateTimeChanged 是時間改變信號,即手動使日期時間發生改變就會發出信號
# 連接子視窗的內置信號與主視窗的槽函式
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 = MultiWindow2()
form.show()
sys.exit(app.exec_())
運行結果:
![]()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/260419.html
標籤:python
