在软件开发中,为了实现子界面与主界面之间的通信,采用了发射信号的方式。子界面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):
中进行使用。
首先是写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: 可视化