PyQt5の概要(22)信号とスロット(下)のマルチウィンドウの相互作用(信号が発生する理由を深く理解しています!ロジックは素晴らしいです!!!!)

目次

1.マルチウィンドウインタラクション(1):シグナルとスロットを使用しないでください

2.マルチウィンドウインタラクション(2):シグナルとスロットを使用する


1.マルチウィンドウインタラクション(1):シグナルとスロットを使用しないでください

いわゆる相互作用は、データの転送です。信号とスロットを使用しないことは、強い結合の方法です。つまり、2つのウィンドウが相互にコントロールを呼び出します。

コード:

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.マルチウィンドウインタラクション(2):シグナルとスロットを使用する

低結合:


ウィンドウAが別のウィンドウBと相互作用する場合、A
はBウィンドウのコントロール直接アクセスしないようにし、Bウィンドウの信号はウィンドウAでアクセスする必要があり、信号にバインドされたスロット関数は次のようになります。指定

例: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_())

 

演算結果:

          

 

 

 

おすすめ

転載: blog.csdn.net/weixin_44593822/article/details/113819017