IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    PyQt使用发射信号emit的方式实现不同的界面及类之间参数值的传递

    52txr发表于 2024-06-09 15:55:00
    love 0

    在软件开发中,为了实现子界面与主界面之间的通信,采用了发射信号的方式。子界面RenderingPar定义了一个信号parametersSelected,包含两个参数:RenderingStyle和edgeshow_flag。当用户点击“确定”按钮后,子界面会发出这个信号,并将这两个参数传递给主界面MainWindow。在主界面中,通过连接子界面的parametersSelected信号到handleParametersSelected槽函数,实现了对子界面发出的信号的处理。这样,当子界面发出信号时,主界面就能接收到这两个参数,并进行相应的处理。

    需求描述

    在一个软件开发中,写了一个子界面进行一些配置操作,然后将值传给软件主界面。但是在实际进行中遇到了很多问题。试了很多种方案,包括类的父子继承关系,或者写函数继承,但是都会遇到奇怪的问题,最终我还是推荐使用发射信号的方式,更加简洁、清楚。

    例如下面是我写的一个子界面,定义为class RenderingPar(QWidget): ......

    子界面示例

    RenderingPar里面定义了一个函数为ParametersOKClicked(也就是“确定”按钮按下后的槽函数),这个函数会得到两个变量,分别为RenderingStyle和edgeshow_flag,分别代表"云图风格"和“是否显示网格线”。RenderingStyle是一个字符串("jet"、“plasma”、“viridis”),edgeshow_flag是数值(0或1)。

    现在得到了值之后,我需要在主界面class MainWindow(QWidget)的函数def ChromatographicSelectionClicked(self):中进行使用。

    emit实现方法

    首先是写class RenderingPar类的写法。完整代码在下面。其实最重要的就是两行代码:

    这样就已经在系统中得到了信号的的值,然后就是在主窗口进行调用了。主窗口的代码实在太长了,我就粘贴主要用到传出信号的那个函数。我写了两个函数,分别用来显示以及对接受信号的处理:

    class MainWindow(QWidget):
        # 初始化主交互界面
        def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent)
            self.ui = Ui_MyMainWindow()
            self.ui.setupUi(self)
            # .........省略了很多
            
        def ChromatographicSelectionClicked(self):
            print("渲染参数选择")
            self.RenderingParametersUi = RenderingPar() # 子界面的实体化
            self.RenderingParametersUi.parametersSelected.connect(self.handleParametersSelected)  # 连接信号
            self.RenderingParametersUi.show() # 显示子界面
            
        def handleParametersSelected(self, renderingStyle, edgeshowFlag):
            print(f"Received parameters: RenderingStyle={renderingStyle}, EdgeShowFlag={edgeshowFlag}")
            # 在这里处理参数
            # Step 3: 可视化


沪ICP备19023445号-2号
友情链接