基于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.mzph.cn/news/583487.shtml

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

相关文章

八股文打卡day7——计算机网络(7)

面试题:HTTPS和HTTP的区别 我的回答: 1.加密方式:HTTP是明文传输;HTTPS使用了SSL/TLS进行加密传输。 2.安全性:由于HTTP是明文传输的,所以数据内容容易被第三方截获和读取。而HTTPS通过SSL/TLS进行加密传…

Vue中使用require.context自动引入组件的方法介绍

我们项目开发中,经常需要import或者export各种模块,那么有没有什么办法可以简化这种引入或者导出操作呢?答案是肯定的,下面就为大家介绍一下require.context require.context 是 webpack 提供的一个 API,用于创建 con…

运行天地图Cesium.js三维服务案例

零、技术选型及相关网址 技术选型:Vue2、VueCli5、Cesium.js、天地图 相关网址:三维服务 - 天地图 帮助文档 一、cesium 初始化参数解析 initializeCesium() {this.viewer new Cesium.Map("cesiumContainer", {shouldAnimate: true, // 是否…

基于二进制包的mysql安装

下载二进制包 wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.35-linux-glibc2.17-x86_64.tar.xz查看是否存在mariadb安装 [rootbogon ~]# rpm -qa | grep mariadb mariadb-libs-5.5.68-1.el7.x86_64#卸载包。 --nodeps 不检验依赖 [rootbogon ~]# rpm -e --…

gem5学习(7):内存系统中创建 SimObjects--Creating SimObjects in the memory system

目录 一、gem5 master and slave ports 二、Packets 三、Port interface 1、主设备发送请求时从设备忙 2、从设备发送响应时主设备忙 四、Simple memory object example 1、Declare the SimObject 2、Define the SimpleMemobj class 3、Define the SimpleMemobj class…

EST-100身份证社保卡签批屏按捺终端PC版web版本http协议接口文档,支持web网页开发对接使用

<!DOCTYPE html><html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,initial-scale1.0"><title>演示DEMO</title><script type"text/…

亚马逊SEO是什么意思?亚马逊标题的SEO方法是什么?-站斧浏览器

亚马逊SEO是什么意思&#xff1f; 亚马逊SEO主要包括了对标题、描述、五点简介等元素的优化&#xff0c;以及评价和评论的管理等方面。下面将详细分析亚马逊SEO的相关内容&#xff0c;帮助卖家更好地理解和应用。 在亚马逊平台上进行SEO优化需要考虑以下几个方面&#xff1a;…

gin框架使用系列之四——json和protobuf的渲染

系列目录 《gin框架使用系列之一——快速启动和url分组》《gin框架使用系列之二——uri占位符和占位符变量的获取》《gin框架使用系列之三——获取表单数据》 上篇我们介绍了如何获取数据&#xff0c;本篇我们介绍一下如何返回固定格式的数据。 一、返回JSON数据 在web开发中…

如何在临近期末考之前,保持一个良好的心态呢?

在临近期末考之前&#xff0c;保持一个良好的心态非常重要&#xff0c;因为这有助于你在考试中发挥出自己的最佳水平。以下是一些建议&#xff0c;帮助你保持冷静和专注&#xff1a; 制定计划&#xff1a;制定一个详细的学习计划&#xff0c;包括每天要复习的科目和内容。这样…

开源安全测试工具 | 网络安全工具列表

自动化渗透测试 • AttackSurfaceMapper (https://github.com/superhedgy/AttackSurfaceMapper) - 自动化渗透测试工具, 使用手册/测试流程 (https://www.uedbox.com/post/59110/)。 • vajra (https://github.com/r3curs1v3-pr0xy/vajra) - 自动化渗透测试. • Savior (https…

Linux管理LVM逻辑卷

目录 一、LVM逻辑卷介绍 1. 概述 2. LVM基本术语 2.1 PV&#xff08;Physical Volume&#xff0c;物理卷&#xff09; 2.2 VG (Volume Group&#xff0c;卷组&#xff09; 2.3 LV (Logical Volume&#xff0c;逻辑卷&#xff09; 3. 常用的磁盘命令 4. 查看系统信息的命…

golang第一卷---go入门

go入门 对于使用go的好处环境变量配置开发工具 参考网站 &#xff1a;go入门 对于使用go的好处 简单好记的关键词和语法。轻松上手&#xff0c;简单易学。更高的效率。比Java&#xff0c;C等拥有更高的编译速度&#xff0c;同时运行效率媲美C&#xff0c;同时开发效率非常高。…

爬虫工作量由小到大的思维转变---<第三十三章 Scrapy Redis 23年8月5日后会遇到的bug)>

前言: 收到回复评论说,按照我之前文章写的: 爬虫工作量由小到大的思维转变---&#xff1c;第三十一章 Scrapy Redis 初启动/conn说明书)&#xff1e;-CSDN博客 在启动scrapy-redis后,往redis丢入url网址的时候遇到: TypeError: ExecutionEngine.crawl() got an unexpected …

Conda简介及常用指令

Conda 是一个开源的包管理器和环境管理器&#xff0c;主要用于安装、运行和升级数据科学和机器学习等领域的软件包和依赖。Conda 可以用于多种语言&#xff0c;包括 Python、R、Ruby、Lua、Scala、Java、JavaScript、C/ C 等。 Conda 的主要特点 环境管理&#xff1a;Conda 允…

linux查看服务器内存

要查看服务器内存&#xff0c;可以使用以下命令&#xff1a; 使用 free 命令来查看服务器的内存使用情况&#xff1a; free -h该命令将显示内存使用情况的摘要&#xff0c;包括总内存、已使用内存、可用内存等信息。 使用 top 命令来实时监视内存使用情况&#xff1a; top在…

Qt GUI 优化方案详解

文章目录 一、引言二、应用启动优化2.1 懒加载概念1. **懒加载的应用场景:**2. **Qt中的懒加载方式:**3. **示例 - C++中的懒加载:**4. **示例 - QML中的懒加载:**2.2 异步加载1. **异步加载的应用场景:**2. **实现异步加载的方式:**3. **示例 - 使用Qt的异步网络请求:*…

数据资产专题3:估值

欢迎关注主页个人介绍及相关链接&#xff0c;获取更多算法源码材料 2023数据资源入表白皮书&#xff0c;推荐系统源码下载-CSDN博客 浅析研发支出费用化和资本化的区别-CSDN博客 商业银行数据资产估值白皮书&#xff0c;推荐系统源码下载-CSDN博客 用友BIP数据资产入表解决…

odoo17核心概念view4——view.js

这是view系列的第四篇文章&#xff0c;专门介绍View组件。 作为一个Component&#xff0c;它总共包含js、css、xml三个标准文件&#xff0c;当然最重要的是view.js 首先在setup函数中对传入的参数props做了各种校验&#xff0c;然后扩展了subenv useSubEnv({keepLast: new Kee…

2. SQL - 约束

1 主键约束 PRIMARY KEY 约束唯一标识数据库表中的每条记录。 主键必须包含唯一的值。 主键列不能包含 NULL 值。 每个表都应该有一个主键&#xff0c;并且每个表只能有一个主键。 添加主键约束 创建表时&#xff0c;在字段描述处&#xff0c;声明指定字段为主键创建表时&…

PLC远程上下载物联网网关的功能

PLC远程上下载物联网网关的功能 设备远程监控&#xff1a;通过物联网网关&#xff0c;可以实时监控PLC设备的运行状态&#xff0c;获取设备的各种参数信息&#xff0c;以便及时发现和解决设备故障。 数据采集与传输&#xff1a;蓝蜂物联网PLC远程网关可以采集PLC设备的各种数据…