打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
PyQT5 窗体采用Signal与Slot传参

1 基本步骤

    (1)在主窗体定义子窗体,并定义连接信号的回调函数。

        self.Frmgauss_fs = frmgauss_fs.Form()

    

        #连接信号

        self.Frmgauss_fs._signal.connect(self.getparameter)


        注意子窗体必须先在init中定义,否则闪退,即使采用exec_()不闪退,但无法接收子窗体传来的信号;连接信号也必须在先定义,不能再主窗体按钮点击事件时定义,否则多次注册回调。

(2)在子窗体定义信号,信号设置数据类型如元组(列表等)

                _signal = pyqtSignal(tuple)

    (3)在子窗体按钮添加点击事件slot

 self.btnCAL.clicked.connect(self.slot)

    (4)在slot中发送信号

self._signal.emit(self.projectparam)

   (4)在主窗体定义按钮调用子窗体获得信号

    def btnOption_Click(self):

        self.Frmgauss_fs.show()

       

    def getparameter(self, parameter):

        # parameter在子窗体的信号中定义的数据类型为元组  _signal = pyqtSignal(tuple)

        # (a, rf, L, falseE, falseN)=projectparam

        self.txtbox.setPlainText(str(parameter))



2 主窗体

import sys

from PyQt5.QtWidgets import (QDialogQGridLayoutQMainWindowQWidget,

                             QPushButtonQDesktopWidgetQSizePolicy,

                             QFileDialogQMessageBoxQHBoxLayout,

                             QVBoxLayoutQApplicationQPlainTextEdit)


import frmgauss_fs



class MainWindow(QMainWindow):

    def __init__(self):

        super().__init__()

        self.initUI()


    def initUI(self):

        #主窗体按钮

        self.btnOption = QPushButton("设置")

        self.btnClose = QPushButton("关闭")

        self.btnClose.clicked.connect(self.btnClose_Click)

        self.btnOption.clicked.connect(self.btnOption_Click)


        # self.txtbox.isReadOnly = True

        # 按钮水平布局放在窗体右下方

        hbox = QHBoxLayout()

        hbox.addStretch(1)

        hbox.addWidget(self.btnOption)

        hbox.addWidget(self.btnClose)


        # 文本框

        self.txtbox = QPlainTextEdit()

        self.txtbox.setMinimumSize(200300)

        # 主布局采用grid布局方式

        maingridlayout = QGridLayout()

        maingridlayout.addWidget(self.txtbox0011)

        maingridlayout.addLayout(hbox1011)


        # 窗体为QMainWindow需添加QWidget,在QWidget的setLayout设置布局控件

        widget = QWidget()

        widget.setLayout(maingridlayout)

        self.setCentralWidget(widget)

        # 窗体为QWidget则直接使用setLayout设置布局控件

        # self.setLayout(vbox)


        self.setGeometry(300300600400)

        self.setWindowTitle('主窗体')

        self.center()


        # 子窗体必须先定义,否则闪退,即使采用exec_()不闪退,但无法接收子窗体传来的信号

        self.Frmgauss_fs = frmgauss_fs.Form()

         #连接信号

        self.Frmgauss_fs._signal.connect(self.getparameter)


    def center(self):

        screen = QDesktopWidget().screenGeometry()  # 获取屏幕的大小

        self.move((screen.width() - self.width()) // 2,

                  (screen.height() - self.height()) // 2)


    def btnClose_Click(self):

        self.close()


    def btnOption_Click(self):

        self.Frmgauss_fs.show()       


    def getparameter(selfparameter):

        # parameter在子窗体的信号中定义的数据类型为元组  _signal = pyqtSignal(tuple)

        # (a, rf, L, falseE, falseN)=projectparam

        self.txtbox.setPlainText(str(parameter))



if __name__ == '__main__':

    app = QApplication(sys.argv)

    ex = MainWindow()

    ex.show()

    sys.exit(app.exec_())







3 子窗体

import sys

from PyQt5.QtWidgets import QApplicationQMessageBoxQMainWindowQDialogQLineEdit

from PyQt5.QtCore import pyqtSignal


# Ui_frmgauss_fs.py为Ui转py,窗体Ui_Form 

from Ui_frmgauss_fs import Ui_Form


# 子窗体包含几个QLineEdit和一个按钮,通过点击按钮,向主窗体发送参数(由几个QLineEdit数值组成元组)

class Form(QDialogUi_Form):

    # 信号定义的数据类型为元组

    _signal = pyqtSignal(tuple)


    def __init__(self, *args, **kwargs):

        super(Formself).__init__(*args, **kwargs)

        self.setupUi(self)


        self.projectparam = (6378137.0298.257222101114.3333333333,

                             800000.00.0)


        # Ui_Form中定义的按钮事件slot

        self.btnCAL.clicked.connect(self.slot)


    def getlineEditText(selftxtbox):

        v = float(

            txtbox.text() if txtbox.text() != "" else txtbox.placeholderText())

        return v


    def slot(self):

        a = float(self.getlineEditText(self.lineEdit_a))

        rf = float(self.getlineEditText(self.lineEdit_rf))

        L = float(self.getlineEditText(self.lineEdit_L))

        falseE = float(self.getlineEditText(self.lineEdit_falseE))

        falseN = float(self.getlineEditText(self.lineEdit_falseN))

        self.projectparam = (arfLfalseEfalseN)

        # 信号发送

        self._signal.emit(self.projectparam)



if __name__ == '__main__':  # 程序的入口

    app = QApplication(sys.argv)

    Frmgauss_fs = Form()

    Frmgauss_fs.show()

    sys.exit(app.exec_())






jcstone 2021-5-15

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Python如何开发桌面软件
用PyQt5实现从主窗口打开子窗口并进行窗口间数据传递的方法
PyQt4 教程(5)
PyQt4 信号和槽详解
【第五节】PyQt5事件和信号
[PyQt Tutorial]5.Signals & Slots(信号与槽)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服