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

2023-11-15

功能实现:

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


代码实现:

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有略微的区别。当时也被这个问题困了一些时间,现在记录下来以便将来遇到时能够提高效率。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Flask+Nginx+uWSGI:导入错误:没有名为站点的模块

    我安装为http www reinbach com uwsgi nginx flask virtualenv mac os x html http www reinbach com uwsgi nginx flask virtualenv
  • 切片稀疏(scipy)矩阵

    我将不胜感激任何帮助 以理解从 scipy sparse 包中切片 lil matrix A 时的以下行为 实际上 我想根据行和列的任意索引列表提取子矩阵 当我使用这两行代码时 x1 A list 1 x2 x1 list 2 一切都很好
  • 从Python中的字符串中提取货币金额

    我正在制作一个程序 从字符串中获取货币并将其转换为其他货币 例如 如果字符串是 the car cost me 13 250 我需要得到 and 13250 我已经有了这个正则表达式 1 确实如此 但是该字符串很有可能有多个价格 并且全部使
  • Python从int到string的快速转换

    我正在用 python 求解大量阶乘 并发现当我完成计算阶乘时 需要相同的时间才能转换为字符串以保存到文件中 我试图找到一种将 int 转换为字符串的快速方法 我将举一个计算和 int 转换时间的例子 我正在使用通用的 a str a 但感
  • Python在postgresql表中查找带有单引号符号的字符串

    我需要从 psql 表中查找包含多个单引号的字符串 我当前的解决方案是将单引号替换为双单引号 如下所示 sql query f SELECT exists SELECT 1 FROM table name WHERE my column m
  • 将 numpy 数组写入文本文件的速度

    我需要将一个非常 高 的两列数组写入文本文件 而且速度非常慢 我发现如果我将数组改造成更宽的数组 写入速度会快得多 例如 import time import numpy as np dataMat1 np random rand 1000
  • 了解 Python 中的酸洗

    我最近接到一项作业 需要以腌制形式放置一本字典 其中每个键引用一个列表 唯一的问题是我不知道腌制形式是什么 谁能给我指出一些好的资源的正确方向来帮助我学习这个概念 pickle 模块实现了一个基本但强大的算法 用于序列化和反序列化 Pyth
  • 当单词以“|”分隔时如何读取文件(埃因霍温)?

    在Python中 我有一个文件 其中的单词由 例如 city state zipcode 我的文件阅读器无法区分单词 另外 我希望我的文件阅读器从第 2 行而不是第 1 行开始 如何让我的文件阅读器分隔单词 import os import
  • 如何在 Python 3 中循环遍历集合,同时从集合中删除项目

    这是我的情况 我有一个list set 哪个并不重要 movieplayer我想调用的对象 preload 功能开启 该预加载函数可以立即返回 但希望将来返回一点 我想存储这个电影播放器 集合 表明它们尚未预加载 然后循环它们 调用prel
  • 如何将 self 传递给装饰器?

    我该如何通过self key下面进入装饰器 class CacheMix object def init self args kwargs super CacheMix self init args kwargs key func Cons
  • WindowsError:[错误 126] 使用 ctypes 加载操作系统时

    python代码无法在Windows 7平台上运行 def libSO lib ctypes cdll LoadLibrary ConsoleApplication2 so lib cfoo2 1 3 当我尝试运行它时 得到来自python
  • python是带有字符串的运算符行为[重复]

    这个问题在这里已经有答案了 我无法理解以下行为 我正在创建 2 个字符串 并使用 is 运算符来比较它 对于第一种情况 它的工作方式有所不同 对于第二种情况 它按预期工作 当我使用逗号或空格时 它显示是什么原因False与比较is当没有使用
  • 乘以行并按单元格值附加到数据框

    考虑以下数据框 df pd DataFrame X a b c d Y a b d e Z a b c d 1 2 1 3 df 我想在 列中附加数字大于 1 的行 并在该行中的数字减 1 df 最好应该 然后看起来像这样 或者它可能看起来
  • 如何使用 matplotlib 为圆柱体的每个单独面添加颜色

    我正在尝试为圆柱体的每个面着色 但是我不确定如何进行 我尝试了以下方法 for i in range 10 col append for i in range 10 for j in range 20 col i append plt cm
  • 为什么 smtplib.SMTP().sendmail 不发送 DKIM 签名邮件

    我已经在服务器上设置了 postfix 以及 openDKIM 当我跑步时 echo Testing setup mail s Postfix test my email address 我收到电子邮件 邮件标题中有一个DKIM Signa
  • 更改 Python Cmd 模块处理自动完成的方式

    我有一个 Cmd 控制台 设置为自动完成 Magic the Gathering 收藏管理系统的卡牌名称 它使用文本参数在数据库中查询卡片 并使用结果自动完成 建议卡片 然而 这些卡片名称有多个单词 Cmd 会从last到行尾的空间 例如
  • Python 通过从现有 csv 文件中过滤选定的行来写入新的 csv 文件

    只是一个问题 我试图将 csv 文件中的选定行写入新的 csv 文件 但出现错误 我试图读取的 test csv 文件是这样的 两列 2013 9 1 2013 10 2 2013 11 3 2013 12 4 2014 1 5 2014
  • 如何在单元测试中使用 JSON 发送请求

    我的 Flask 应用程序中有在请求中使用 JSON 的代码 我可以像这样获取 JSON 对象 Request request get json 这一直工作得很好 但是我正在尝试使用 Python 的 unittest 模块创建单元测试 但
  • 长/宽数据到宽/长

    我有一个数据框 如下所示 import pandas as pd d decil 1 decil 1 decil 2 decil 2 decil 3 decil 3 decil kommune AA BB AA BB AA BB 2010
  • 缓存 Flask-登录 user_loader

    我有这个 login manager user loader def load user id None return User query get id 在我引入 Flask Principal 之前它运行得很好 identity loa

随机推荐

  • [python] 路径相似度

    问题以及解 path 1 b1 path a b1 path a b1 c 1 输入一个路径的值 path 正则表达式 正则表达式 设这个字符串为ST1 2 输入一个被比较的路径值 path 1 b1 ST2 将第一个字符串ST1 进行sp
  • 2022java面试题

    seata tcc 和at模式区别 feign 常用哪些参数 缓存穿透 缓存击穿 Springmvc执行流程 过滤器拦截器的区别 kafka的0拷贝 kafka的原理 线程池如何实现只有线程池里面的任务执行完之后 才去给线程池添加任务 让你
  • 随机森林(Random Forest),决策树,bagging, boosting(Adaptive Boosting,GBDT)

    http www cnblogs com maybe2030 p 4585705 html 阅读目录 1 什么是随机森林 2 随机森林的特点 3 随机森林的相关基础知识 4 随机森林的生成 5 袋外错误率 oob error 6 随机森林工
  • 【每日一C之十七】#ifndef与#pragma once的用法与区别

    每日一C之 ifndef与 pragma once 每天拾一个C语言贝壳 厚积薄发 积跬步以致千里
  • Unity 笔记SortingLayer、Order in Layer和RenderQueue讲解

    1 首先先了解一下摄像机的Depth 深度渲染 深度值越低 越先渲染 深度值高 后渲染 所以一般UICamera的Depth大于3D摄像机 Culling Mask 主要是相机针对不同层级的物体进行渲染的操作 想让相机渲染哪个层就勾选哪个层
  • InputStream Reader FileInputStream BufferedReader InputStreamReader FileReader FileInputStream和转换流

    原文地址 转发备忘 https blog csdn net liu940204 article details 79994467 ava io下面有两个抽象类 InputStream和Reader InputStream是表示字节输入流的所
  • 全网最全fiddler使用教程和fiddler如何抓包(fiddler手机抓包)-笔者亲测

    目录 导读 一 前言 二 HTTP协议 三 Fiddler简介和工作原理 四 Fiddler六大块详解 五 Fiddler过滤器 六 Fiddler 对于WEB项目的抓包和改包项目实战 七 Fiddler弱网测试 八 Fiddler抓取ht
  • springboot项目打包提示Unable to find a single main class from the following candidates错误

    提示Unable to find a single main class from the following candidates错误的原因是会从所有代码里面扫描包括main方法的类 找到多个类就报错了 解决办法是在pom xml指定启动
  • 因果关系的骚操作

    import numpy as np from sklearn datasets import load boston boston load boston print boston target shape print boston da
  • 【软考备考-综合知识】操作系统基础

    操作系统概念 能有效地组织和管理系统中的各种软 硬件资源 合理地组织计算机系统工作流程 控制程序的执行 并且向用户提供一个良好的工作环境和友好的接口 特征与功能 操作系统的4个特征是并发性 共享性 虚拟性和不确定性 操作系统的功能可以分为处
  • ElasticSearch的Update By Query的坑(使用注意事项及其方案)

    ES的Update By Query对应的就是关系型数据库的update set where 语句 ES的Update By Query可能存在的坑 比如批量更新时非事务模式执行 允许部分成功部分失败 大批量操作会超时 频繁更新会报错 版本
  • 2019年9月26日星期四(STM32 ucos3 )

    一 消息队列 1 概念 信号量本身不能传递数据 如果希望在任务通信同时传递数据 可以使用消息队列 任务和中断都可以发送消息 但是只有任务能够接收消息 2 编程使用 1 创建消息队列 void OSQCreate OS Q p q 消息队列控
  • Windows&Linux文件传输方式总结

    技术交流 关注微信公众号 Z20安全团队 回复 加群 拉你入群 一起讨论技术 直接公众号文章复制过来的 排版可能有点乱 可以去公众号看 在渗透过程中 通常会需要向目标主机传送一些文件 来达到权限提升 权限维持等目的 本篇文章主要介绍一些wi
  • K8s部署自己的web项目

    一 静态网页项目 1 前端项目源码下载 链接 https pan baidu com s 15jCVawpyJxa0xhCJ9SwTCQ 提取码 m4an 2 编写nginx conf和Dockerfile 放在项目根目录下 1 创建ngi
  • word排版插件_8款堪称神器的Office插件,让你工作效率直线飙升!

    Hello 各位叨友们好呀 我是叨叨君 上班了 上班了 打开电脑又要和PPT Word Excel软件打交道了 是不是感觉工作效率有点低呢 今天给大家推荐8款超实用的Office插件 让你工作效率直线飙升 一 Word插件 1 小恐龙公文排
  • 虚函数

    说一说虚函数 1 虚函数 就是在类的成员函数的前面加virtual关键字 2 虚函数通过虚函数表 虚表 来实现 虚表中存的是虚函数指针 3 虚函数和普通函数一样的 都是存在代码段的 只是他的指针又存到了虚表中 4 类的对象中存的是虚表指针
  • AndroidStudio 快速生成代码模板

    1 打开设置 File New Projects Settings Preferences for New Projects 不管什么版本 总之打开Settings 2 创建模板 1 搜索 Templates 模板 可以看到其实创建 cal
  • Git-用 cherry-pick 挑好看的小樱桃

    前篇 在此之前 我想问一个问题 你是在接触 Git 多久之后 知道有这个命令的 我的答案是很久很久之后 这真是一个悲伤的故事 懒 是万恶之源 此话果然不假 cherry pick 能干啥 cherry 中文翻译是樱桃 pick 中文翻译是采
  • 关系代数中的除法运算

    关系代数中的除法运算 这个概念的描述的非常抽象 刚开始学习的同学完全不知所云 这里通过一个实例来说明除法运算的求解过程 设有关系R S 如图所示 求R S 的结果 求解步骤过程 第一步 找出关系R和关系S中相同的属性 即Y属性 在关系S中对
  • Python-Pyqt6主窗口调用子窗口并互相传递参数

    功能实现 在主窗口点击按钮 调出子窗口 并向子窗口传递参数 在子窗口输入数据后再向主窗口传递参数 并在主窗口显示输入的数据 代码实现 1 载入图形化界面 在MainWinGUI py和ChildWinGUI py两个文件中编写主窗口和子窗口