关于PyQt5信号槽机制的解析

信号槽机制是 Qt 框架中用于对象间通信的核心机制,它基于发布-订阅模式,能够实现松耦合的组件交互。


1. 信号槽机制的基本概念

信号(Signal)
  • 信号是对象发出的一种通知,表示某个事件发生了。例如,当用户点击按钮时,按钮会发出一个“点击”信号。
  • 信号本身不包含任何逻辑,只是通知其他对象发生了某件事。
槽(Slot)
  • 槽是对象中的一个函数,用于响应信号。例如,当按钮发出“点击”信号时,槽函数可以执行导入图片的逻辑。
  • 槽函数可以包含具体的业务逻辑。
连接(Connect)
  • 通过 connect 函数,将信号与槽关联起来。当信号发出时,槽函数会自动被调用。
  • 信号槽的连接是松耦合的,信号发出者不需要知道槽的具体实现。

2. 结合“导入图片”功能

假设我们有一个图片导入功能,用户点击“导入”按钮后,程序会从文件系统中选择一张图片并显示在界面上。我们可以用信号槽机制来实现这个功能。

组件
  1. 按钮(QPushButton)
    • 发出“点击”信号,表示用户点击了按钮。
  2. 文件对话框(QFileDialog)
    • 用于选择图片文件。
  3. 图片显示控件(QLabel)
    • 用于显示导入的图片。
信号槽设计
  1. 按钮点击信号
    • 当用户点击“导入”按钮时,按钮发出 clicked() 信号。
  2. 文件选择槽
    • 连接 clicked() 信号到一个槽函数,该槽函数打开文件对话框,让用户选择图片文件。
  3. 图片显示槽
    • 当用户选择图片文件后,文件对话框发出 fileSelected(QString) 信号,连接该信号到另一个槽函数,该槽函数将图片加载并显示在 QLabel 中。

槽函数设计思路

首先,通过Qt Designer创建用户界面,定义窗口、布局和控件的外观。

导出UI文件后,在VScode中使用pyuic5将UI文件转换为相应的Python代码。

接着,在PyCharm中创建主程序,编写槽函数来处理用户界面上的交互。

在总体设计思路中,强调界面与逻辑分离、利用可视化工具设计界面、并通过代码生成工具将界面与槽函数协同合作,实现清晰、高效的软件开发。

在主程序中,通过导入生成的模块,实例化界面类,并连接槽函数,实现了界面与逻辑的协同工作。具体的槽函数与前端界面的衔接思路如下:
在设计完标注软件的主界面MainWindow.ui后,创建mainwindow.py文件作为与前端相连的功能控制块,并在文件内创建MainWindow类继承(前端主界面)类Ui_MainWindow。
在MainWindow类里面进行相关变量或标志量的初始化,以及初始化主界面当中各个action所衔接的槽函数。mainwindow.py文件主要作用于直接与前端主窗口界面的各个控件块的连接中转站。
首先,以mainwindow=self为参数,实例化各个前端界面类,这样将主窗口MainWindow内的各个实例与控件块的构造函数相互协同工作,使得控件块更容易地与主窗口进行交互,执行主窗口 的方法以及访问属性等,这样获取上下文信息,执行相关操作的协同工作模式更有利于后续新添功能的实现。
接着,再通过“self.action.triggered.connect(槽函数)”的方式,将主窗口中各个控件块与后端的槽函数联系起来,再通过对每个子窗口界面类的实例化,通过简单的调用子窗口界面的函数“self.实例化子窗口类的名称.show”,使用用户会更加直观的看见触发控件点击后,跳出与之对应的子窗口界面,紧接继续操作。
同时,创建canvas.py文件用于对主窗口中的图像显示,依据算法实现语义分割标注结果的展现等槽函数的撰写。mainwindow.py主要作为各个子窗口界面的槽函数衔接中转站,在后续其他子窗口一界面或者主窗口界面其他功能的python文件均可以被逐级分化下去撰写,提高整个软件的层次性,例如:绘制所需要的polygon.py、raw文件转化png文件的raw_png.py、图像文件显示的子窗口界面file_dock.py等,都是通过更深一层的具体槽函数撰写实现;而canvas.py则主要作用于主窗口界面中保留的空白部分作用“画布”,来展现图像以及语义分割后直观的视觉体现。
其中在撰写关于各个主要功能块槽函数的过程中,将模型嵌入到软件,xxx,xxx,等环节作为本项目软件开发的关键功能模块。
这段内容主要描述了在使用Qt进行软件开发时,槽函数的设计思路以及如何将前端界面与后端逻辑进行衔接。以下是按照逻辑逐条解析的内容:

 1. 界面设计与代码生成
    Qt Designer:首先使用Qt Designer创建用户界面,定义窗口、布局和控件的外观。
    UI文件转换:将设计好的UI文件导出,并使用pyuic5工具将其转换为Python代码。这一步生成了与界面对应的Python类(如Ui_MainWindow)。
 2. 主程序与槽函数的编写
    主程序创建:在PyCharm中创建主程序,编写槽函数来处理用户界面上的交互。
    界面与逻辑分离:强调界面与逻辑的分离,利用可视化工具设计界面,并通过代码生成工具将界面与槽函数协同工作,实现清晰、高效的软件开发。
 3. 槽函数与前端界面的衔接
    创建mainwindow.py文件:该文件作为与前端界面相连的功能控制块。在文件中创建MainWindow类,继承自前端主界面类Ui_MainWindow。
    初始化变量与槽函数:在MainWindow类中进行相关变量或标志量的初始化,并初始化主界面中各个action所连接的槽函数。
    实例化前端界面类:以mainwindow=self为参数,实例化各个前端界面类。这样可以将主窗口MainWindow内的各个实例与控件块的构造函数协同工作,使得控件块更容易与主窗口进行交互。
 4. 控件与槽函数的连接
    连接槽函数:通过self.action.triggered.connect(槽函数)的方式,将主窗口中各个控件块与后端的槽函数联系起来。
    子窗口的显示:通过对每个子窗口界面类的实例化,调用子窗口界面的show函数,使用户在触发控件点击后,能够直观地看到对应的子窗口界面。
 5. 图像显示与槽函数的实现
    创建canvas.py文件:该文件用于处理主窗口中的图像显示,依据算法实现语义分割标注结果的展现等槽函数的撰写。
    mainwindow.py的作用:该文件主要作为各个子窗口界面的槽函数衔接中转站。后续其他子窗口界面或主窗口界面的功能可以通过逐级分化的方式撰写,提高软件的层次性。
    其他功能模块:例如绘制多边形功能的polygon.py、将RAW文件转换为PNG文件的raw_png.py、图像文件显示的子窗口界面file_dock.py等,都是通过更深一层的具体槽函数撰写实现。
 6. 关键功能模块
    模型嵌入:在撰写各个主要功能块的槽函数过程中,将模型嵌入到软件中,作为项目开发的关键功能模块。
 总结
 界面与逻辑分离:通过Qt Designer设计界面,使用pyuic5生成Python代码,实现界面与逻辑的分离。
 槽函数与控件的连接:通过triggered.connect将控件与槽函数连接,实现用户交互。
 子窗口与功能模块:通过实例化子窗口类并调用show方法,实现子窗口的显示。通过逐级分化的方式撰写各个功能模块的槽函数,提高软件的层次性和可维护性。
 关键功能模块:将模型嵌入到软件中,作为项目开发的关键功能模块。

通过这种设计思路,可以实现一个结构清晰、易于维护的Qt应用程序。

你可能感兴趣的:(我的学习记录,项目,python开发,qt,开发语言)