基于PyQt5自定义UI的详细教程

  • PyQt5和Qt designer的详细安装教程:https://blog.csdn.net/qq_43811536/article/details/135185233?spm=1001.2014.3001.5501
  • Qt designer界面和所有组件功能的详细介绍:https://blog.csdn.net/qq_43811536/article/details/135186862?spm=1001.2014.3001.5501
  • Qt designer设计UI实例:双视图立体匹配与重建的可视化UI:https://blog.csdn.net/qq_43811536/article/details/135198820?spm=1001.2014.3001.5501

目录

  • 1. 实例:双视图立体匹配与重建的可视化UI
  • 2. 一个简单的UI展示
  • 3. 基于PyQt5自定义UI功能
    • 3.1 查询UI中组件的变量名
    • 3.2 使用PyQt5对小组件自定义功能


1. 实例:双视图立体匹配与重建的可视化UI

  • 输入:一对左右眼视图的图像。
  • 任务:对输入的一对带相机参数的左右眼图像数据,实现SAD、NCC 两种局部的立体匹配方法进行重建。
  • 输出
    • 基本的交互界面供用户选择立体匹配算法以及输入的图片。
    • 将每种立体匹配方法所用的时间以及图片大小信息显示出来。
    • 可视化重建的结果,如点云,深度图,视差图等,可以使用Meshlab 软件
      或者Open3D 进行可视化

2. 一个简单的UI展示

针对上述实例要求,设计了一个简单的符合要求的UI如下图所示。界面包含图片选择(Picture)、匹配算法选择(Matching algorithm)、成本函数选择(Matching cost)、运行按钮(Run)、图片显示窗口(Picture visualization)、结果显示窗口(Results display)和输出信息窗口(Output information)

在这里插入图片描述


3. 基于PyQt5自定义UI功能

3.1 查询UI中组件的变量名

首先,Qt designer设计的UI中的每一个组件对象都有一个变量名,即下图红框中的“对象”,例如Picture窗口中的图片选项栏对应的变量名就是comboBox,右边的QComboBox是我们在Qt designer界面和所有组件功能的详细介绍中介绍过的一个小组件的父类。默认的组件变量名如下图中所示,当然也可以自定义变量名方便后续编程。

在这里插入图片描述

3.2 使用PyQt5对小组件自定义功能

  • 导入所需的所有包:
# 这里仅展示PyQt5相关包
from PyQt5.QtWidgets import *
from PyQt5 import uic, QtGui, QtWidgets, QtCore
  • 定义UI的类:
class MyWindow(QWidget):def __init__(self):self.init_ui(self)  # 初始化设计的界面def init_ui(self, self1):"""获取UI中需要自定义的组件的变量名"""
  • init_ui()函数,注意变量名与Qt designer中对象一一对应:
def init_ui(self):self.ui = uic.loadUi("./Stereo_matching.ui", self1)  # 加载 .ui 文件self.scenario_name = self.ui.comboBox.currentText()  # 双视图self.matching_algorithm = self.ui.comboBox_5.currentText()  # 匹配算法self.matching_cost = self.ui.comboBox_6.currentText()  # 匹配costself.graphicsView = self.ui.graphicsView  # 左右视图self.graphicsView_2 = self.ui.graphicsView_2  # 结果self.text = self.ui.textBrowser  # 显示结果# 绘制当前选择的双视图self.ui.comboBox.currentIndexChanged.connect(self.draw_current_scenario)# 给RUN按钮绑定事件run_button = self.ui.pushButtonrun_button.clicked.connect(self.run)
  • 根据运行逻辑,当我们选择一对双视图之后首先应该实时绘制出来,方便用户根据实际图片决定是否需要更换双视图的选择。所以我们需要定义一个信号与槽(Signals and Slots)函数,在小组件comboBoxgraphicsView 之间建立交互,即上一段代码中的self.ui.comboBox.currentIndexChanged.connect(self.draw_current_scenario),这行代码的含义是一旦comboBox中当前的索引改变(即当前选项改变),则执行self.draw_current_scenario()函数。这里,我们将self.draw_current_scenario()函数定义如下(注意形参为self的函数是UI类内函数,其他均为类外全局函数):
def draw_current_scenario(self):self.text.append("Drawing pictures...")# 获取当前的双视图self.scenario_name = self.ui.comboBox.currentText()# 读取左右视图left_image, right_image, groundtruth_image, mask_image = import_image(self.scenario_name)# 绘制左右视图、groundtruth、maskplot_image(self.scenario_name, left_image, right_image, groundtruth_image, mask_image)self.text.append("The picture's size: " + str(left_image.shape))self.text.append("Click RUN to start.\n")self.picture_visualization()def picture_visualization(self):pixmap = QtGui.QPixmap(f"./results/{self.scenario_name}_input.png")# 创建 QGraphicsScenescene = QtWidgets.QGraphicsScene(self)scene.addPixmap(pixmap)# 创建 QRectF 对象rect = QtCore.QRectF(pixmap.rect())scene.setSceneRect(rect)# 设置 QGraphicsViewself.graphicsView.setScene(scene)# 调整视图以适应场景的内容self.graphicsView.fitInView(scene.sceneRect(), QtCore.Qt.KeepAspectRatio)def import_image(scenario_name):"""读取左右视图"""
def plot_image(scenario_name, left_image, right_image, groundtruth_image, mask_image):"""绘制左右视图、groundtruth、mask等"""
  • 在选择一对双视图之后,用户需要选择匹配算法和cost算法,最后点击RUN按钮运行。由于选择匹配算法和cost算法时界面不需要有其他功能体现,所以不需要做额外定义,主要RUN之前更新一下当前的双视图、匹配算法、匹配cost即可。点击RUN按钮运行同样需要定义一个信号与槽函数run_button.clicked.connect(self.run)
def run(self):# 获取当前的双视图、匹配算法、匹配costself.scenario_name = self.ui.comboBox.currentText()self.matching_algorithm = self.ui.comboBox_5.currentText()self.matching_cost = self.ui.comboBox_6.currentText()# 调用main.py中的run_stereo_matching函数t1 = time.time()result_pic, acc = run_stereo_matching(self.scenario_name, self.matching_algorithm, self.matching_cost,)if result_pic is not None:# 显示结果self.result_display()t2 = time.time()self.text.append(f"Runtime: {t2 - t1:.3f}s")self.text.append(f"The result's size: {str(result_pic.shape)}")if acc is not None:self.text.append(f"Acc: {acc:.5f}\n")else:self.text.append("Warning! NCC is not applicable to this picture!\n")def run_stereo_matching(scenario_name, matching_algorithm_name, matching_cost_name):"""运行双视图立体匹配"""
  • 最后,运行结果需要呈现在Display窗口,同时运行日志要在Output information窗口中输出。其中运行日志可以通过self.text.append()进行实时输出,运行结果绘制类似picture_visualization(self)函数,定义如下:
def result_display(self):pixmap = QtGui.QPixmap(f"./results/{self.scenario_name}_{self.matching_algorithm}_{self.matching_cost}.png")# 创建 QGraphicsScenescene = QtWidgets.QGraphicsScene(self)scene.addPixmap(pixmap)# 创建 QRectF 对象rect = QtCore.QRectF(pixmap.rect())scene.setSceneRect(rect)# 设置 QGraphicsViewself.graphicsView_2.setScene(scene)# 调整视图以适应场景的内容self.graphicsView_2.fitInView(scene.sceneRect(), QtCore.Qt.KeepAspectRatio)
  • 最最后,运行UI:
if __name__ == "__main__":app = QApplication(sys.argv)w = MyWindow()# display the windoww.ui.show()sys.exit(app.exec_())

创作不易,麻烦点点赞和关注咯!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/308000.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

提升数据库性能的关键指南-Oracle AWR报告

文章目录 一、了解AWR报告:数据库性能的仪表盘二、生成AWR报告三、解读AWR报告的关键部分1.报告开头的系统基础信息2.ADDM发现3.负载概览(Load Profile)4.参数文件5.顶级前台等待事件6.SQL 统计信息-顶级SQL7.SGA Advisory AND PAG Advisory 一、了解AWR报告&#x…

MYSQL二主二从集群部署

目录 一、环境描述 二、安装mysql 2.1 卸载mysql(如果没安装过,可忽略) 2.1.1 列出安装的mysql 2.1.2 卸载mysql 2.1.3 删除mysql文件目录 2.1.3.1 查看mysql 目录 2.1.3.2 依次删除 2.2 在线安装 2.2.1 下载安装源 2.2.2 安装源rpm 2.2.3 加入rpm密钥 …

uniapp路由

1、路由登记 uni-app页面路由为框架统一管理,开发者需要在pages.json里配置每个路由页面的路径及页面样式。 类似小程序在 app.json 中配置页面路由一样。 所以 uni-app 的路由用法与 Vue Router 不同,如仍希望采用 Vue Router 方式管理路由,…

7.6分割回文串(LC131-M)

算法: 有很多分割结果,按照for循环去做肯定做不来 这个时候就要想到回溯!那就要画树! 画树 分割的画树过程其实和组合很像。 例如对于字符串aab: 组合问题:选取一个a之后,在ab中再去选取第…

2020年认证杯SPSSPRO杯数学建模B题(第一阶段)分布式无线广播全过程文档及程序

2020年认证杯SPSSPRO杯数学建模 B题 分布式无线广播 原题再现: 以广播的方式来进行无线网通信,必须解决发送互相冲突的问题。无线网的许多基础通信协议都使用了令牌的方法来解决这个问题,在同一个时间段内,只有唯一一个拿到令牌…

STM32F407-14.3.10-表73具有有断路功能的互补通道OCx和OCxN的输出控制位-00x00

如上表所示,MOE0,OSSI0,CCxE0,CCxNE0时,OCx与OCxN的输出状态取决于GPIO端口上下拉状态。 ---------------------------------------------------------------------------------------------------------------------…

Matlab:BP神经网络算法,二叉决策树

1、BP神经网络算法 (1)步骤 1.准备训练数据和目标值 2.创建并配置BP神经网络模型 3.训练BP神经网络模型 4.用BP神经网络模型预测数据 例:某企业第一年度营业额为132468,第二年度为158948,第三年度为183737,预测第四年度的营…

VScode的入门手册(IDEA迁移到VScode)

从IDEA迁移到VScode的过程中,会有很多不适应的地方,下面算是一篇VScode的入门手册,也可以说是从IDEA迁移到VScode的手册。 命令面板(Command Palette) 允许你快速访问和执行命令。 在 Visual Studio Code 中&#x…

GPT编程(1)八分类图像数据集转换为二分类

一个核心问题就是要将这八类数据图片全部重命名,尝试了一步到位 有一个图像数据集,有八个类别amusement,anger,awe,contentment,disgust, excitement, fear,sadness的图片,每张图片被命名为“类别数字”。采用遍历的方式,按顺序阅…

Animate 2024(Adobe an2024)

Animate 2024是一款由Adobe公司开发的动画和互动内容创作工具,是Flash的演进版本。Animate 2024为设计师和开发者提供了更丰富的功能,让他们能够创建各种类型的动画、交互式内容和多媒体应用程序。 Animate 2024具有以下特点: 强大的设计工…

LT8612UX-HDMI2.0 to HDMI2.0 and VGA Converter with Audio,支持三通道视频DAC

HDMI2.0 to HDMI2.0 and VGA Converter with Audio 1. 描述 LT8612UX是一个HDMI到HDMI和vga转换器,它将HDMI2.0数据流转换为HDMI2.0信号和模拟RGB信号。 它还输出8通道I2S和SPDIF信号,使高质量的7.1通道音频。 LT8612UX支持符合HDMI2.0/ 1.4规范的…

Typora快捷键设置详细教程

文章目录 一、快捷键设置步骤二、设置快捷键简单案例参考资料 一、快捷键设置步骤 在typora软件中,快捷键的设置步骤主要为: 打开【文件】–>【偏好设置】,找到【通用】–>【打开高级设置】,找到 conf.user.json 文件。 然…