Python-Pyqt6主窗口调用子窗口并互相传递参数

功能实现:

在主窗口点击按钮,调出子窗口,并向子窗口传递参数;在子窗口输入数据后再向主窗口传递参数,并在主窗口显示输入的数据。


代码实现:

1.载入图形化界面

在MainWinGUI.py和ChildWinGUI.py两个文件中编写主窗口和子窗口,并导入它们,实现功能与逻辑分离。

from PyQt6 import QtWidgets, QtCore, QtGui
from PyQt6.QtWidgets import *
import sys

from MainWinGUI import Ui_MainWindow
from ChildWinGUI import Child_MainWindow

运行后操作的界面如下:

主窗口界面
主窗口界面

子窗口界面
子窗口


2.主窗口功能实现

  • 定义

主窗口只包含两个区域,显示区与Send 1、Send 2按钮。单击Send 1与Send 2都将调出子窗口,并且将向子窗口传递信息究竟是1调用还是2调用的子窗口。其功能实现如下:

class MainForm(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MainForm, self).__init__()
        self.setupUi(self)                # 函数定义来自MainWinGUI.py

        # 这里的ChildForm()是我们创建子窗口类
        # 我们将其命名为OurNewWindow
        self.OurNewWindow = ChildForm()  # 子窗口实例化

        # 调用子窗口,并向子窗口传递参数
        # 方法 1
        self.SendButton_1.clicked.connect(self.CallChildWin)
        self.SendButton_2.clicked.connect(self.CallChildWin)

        # 方法 2,使用lambda传递自定义参数
        self.SendButton_1.clicked.connect(lambda: self.CallChildWin(1))
        self.SendButton_2.clicked.connect(lambda: self.CallChildWin(2))   

使用信号将按键连接到槽或者回调函数(CallChildWin)

self.SendButton_1.clicked.connect()
  • 功能

回调函数中判断需要传递的参数并实现调用子窗口。这个步骤可以使用两种方式实现:

 方法 1:通过在CallChildWin里使用sender().text()对当前按键的名称进行判断后,对btn_num进行赋值,并将其传回子窗口。

def CallChildWin(self):
    #初始化子窗口
    self.OurNewWindow.init_Ui()
    # 显示子窗口
    self.OurNewWindow.show()

    # 使用sender()获取当前按键名称判断是 Send 1 还是 Send 2
    if self.sender().text() == 'Send 1':
        self.OurNewWindow.btn_num = 1
    else:
        self.OurNewWindow.btn_num = 2
    

此时的btn_num是在子窗口类中定义的整型变量,因此在给它赋值的时候,需要在前面加上子窗口类的名称(OurNewWindow)。这里就能实现向子窗口传递参数了。

方法 2: 使用Lambda表达式直接向槽传递额外的参数

def CallChildWin(self, num):
    # 初始化子窗口
    self.OurNewWindow.init_Ui()
    # 显示子窗口
    self.OurNewWindow.show()

    # 根据传入的实参来赋值btn_num
    if num == 1:
        self.OurNewWindow.btn_num = 1
    else:
        self.OurNewWindow.btn_num = 2

 同样的,btn_num是在子窗口类中定义的整型变量,因此在给它赋值的时候,需要在前面加上子窗口类的名称(OurNewWindow)。这里就能实现向子窗口传递参数了。

此时主窗口的按钮功能基本写完,还需要一个显示接收的子窗口参数的函数:

def display_params(self, arg1, arg2, arg3, arg4):
    # 显示
    self.textBrowser.append("The shape is: %s" % arg1)
    self.textBrowser.append("Length = : %d" % arg2)
    self.textBrowser.append("Width = : %f" % arg3)
    self.textBrowser.setText("This is sent from Send %d" % arg4)

 需要传入的四个形参分别对应:shape(字符串 str)、Length(整型 int)、Width(浮点型 float)和按键编号(整型 int)。


3.子窗口功能实现

  • 定义

  子窗口只有三个输入框和一个按键,class ChildForm的定义如下:

class ChildForm(QMainWindow, Child_MainWindow):
    
    # 定义信号
    param_signal = QtCore.pyqtSignal(str, int, float, int)  # 分别对应shape Length Width num
    
    def __init__(self):
        super(ChildForm, self).__init__()
        self.setupChildUi(self)            # 函数定义来自ChildWinGUI.py
        self.retranslateUi(self)           # 函数定义来自ChildWinGUI.py

        # 定义按键序号
        self.btn_num = 0

        # 绑定信号和槽
        self.Save_button.clicked.connect(self.save_func)

在最开始定义的信号

param_signal = QtCore.pyqtSignal(str, int, float, int)

可以实现将四个值传回主窗口的。并且定义pyqtSignal时,我们需要手动初始化需要传递的参数类型,括号里的(str, int, float, int)便是对应上节display_params()所需要的形参。

  • 功能

Save_func函数将保存用户手动输入的shape, length, width值与主窗口传递过来的btn_num值,并将这四个值传回主窗口。    

def save_func(self):
    in_type = self.lineEdit_rec.text()        # 读取shape输入
    in_length = int(self.lineEdit_l.text())   # 读取length输入
    in_width = float(self.lineEdit_w.text())  # 读取witdth输入
    in_num = self.btn_num                     # 读取按键编号

    # 发送信号
    self.param_signal.emit(in_type, in_length, in_width, in_num)

    # 保存后关闭子窗口
    self.close()

此时,由子窗口向主窗口发送参数的信号已经通过

self.param_signal.emit(in_type, in_length, in_width, in_num)

实现。发送有了,那么如何接收呢?

这就需要回到主窗口的功能实现函数里来接收这个param_signal。


4.接收信号 

这一步就很简单了,接收信号,再想要把这个信号如何处理?放入display_params()函数里进行显示。

只需要在CallChildWin()里面加一句:

# 连接信号
self.OurNewWindow.param_signal.connect(self.display_params)

这样便接收了(in_type,in_length,in_width,in_num)四个实参,并将它们传给了display_params()。


结果显示:

Send 1
Send 1
弹出子窗口,并输入变量
Send 2

结束语:

在使用Pyqt的调用子窗口时,与Matlab的app designer有略微的区别。当时也被这个问题困了一些时间,现在记录下来以便将来遇到时能够提高效率。

  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Python-pyqt5-hexview是一种基于Python和PyQt5这两个开发工具创建的十六进制数据查看器,是一个实用的工具,可以方便地查看二进制、十六进制数据。它提供了一种方便的方法来查看和编辑二进制文件,可以快速鉴定和分析数据,是开发人员、安全研究人员和网络管理员的理想选择。 Python-pyqt5-hexview可以明显提高开发人员的编程效率,节省时间和精力。它提供了一个友好的图形用户界面,用户可以在这个界面中选择要查看的数据文件,并自动将其转换成十六进制格式。具体而言,用户可以通过界面的文件浏览器来选择所需文件并打开文件。接下来,Python-pyqt5-hexview将自动将其读入并将数据转换成十六进制形式,并将其呈现在界面上。 Python-pyqt5-hexview支持多种常见的数据格式,以便用户可以轻松地查看和编辑复杂的数据文件。此外,它还具有许多其他功能,包括选择数据的起始和结束位置、搜索特定的十六进制模式、支持编辑和自动保存等。总之,Python-pyqt5-hexview是一个极为实用的数据查看器,为用户提供了一种方便、快速和高效的方式来查看和分析二进制和十六进制数据。 ### 回答2: Python-pyqt5-hexview是一种Python的库,是一个用于视觉化hex编辑器的插件。它使用PyQt5创建了一个用户界面,使用户能够以字节的形式查看和编辑二进制文件。此外,它还提供了搜索和替换功能,使用户能够快速准确地定位到需要编辑的信息。Python-pyqt5-hexview易于使用,具有良好的用户界面,是一款非常实用的工具。它可以被应用于各种领域,如数据恢复和修复、漏洞分析和漏洞利用。通过Python-pyqt5-hexview,用户可以查看和编辑数据,发现和利用漏洞,更好地理解和分析二进制文件。此外,它还可以被用于创建自定义hex编辑器,满足特定需求的个性化开发。总之,Python-pyqt5-hexview是一个功能强大的工具,为大量二进制文件的处理提供了方便、快捷的途径。 ### 回答3: Python-PyQt5-Hexview是一个Python和PyQt5编写的十六进制查看器,可以用于查看和编辑二进制文件。它具有用户友好的界面和丰富的操作功能,可以以字节为单位显示文件内容,并支持多种数据视图,方便用户查看和编辑不同格式的数据。此外,Python-PyQt5-Hexview还支持从文件和剪贴板中导入和导出数据,用户可以轻松地将文件内容复制到剪贴板并粘贴到其他应用程序中。除此之外,用户还可以将文件保存为常见的二进制文件格式,如.HEX或.BIN,方便用户进行后续的处理和分析。Python-PyQt5-Hexview还可以进行搜索和替换操作,用户可以快速定位和修改文件中的关键信息。Python-PyQt5-Hexview支持Windows、Linux和MacOS等多个操作系统,用户可以在不同平台上轻松使用它。总之,Python-PyQt5-Hexview是一个功能强大且易于使用的十六进制查看器,可以帮助用户快速查看和编辑二进制文件,是程序员和安全专家必备的工具之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值