Pyside6-QTableView实战

使用效果

代码

import cv2
import osfrom ui.imageQuery import Ui_DialogImageQuery
from utils.log_util import log_message
from utils.sys_util import create_dirfrom PySide6.QtWidgets import QApplication, QDialog, QGraphicsPixmapItem, QGraphicsScene
from PySide6.QtCore import Qt, QModelIndex, QDate
from PySide6.QtGui import QMouseEvent, QPixmap, QWheelEvent, QStandardItemModel, QStandardItem, QImageclass ImageQueryDialog(QDialog, Ui_DialogImageQuery):def __init__(self):super(ImageQueryDialog, self).__init__()self.setupUi(self)self.setWindowFlags(Qt.FramelessWindowHint)self.setStyleSheet('border: 1px solid #676767')self.setWindowMiddle()self.setMouseTracking(True)self.dragStartPosition = Noneself.edtDate.setStyleSheet('QDateEdit{color:white}')self.btnQuery.setStyleSheet('QPushButton{border: 0px;font-size:18px}')self.edtDate.setDate(QDate.currentDate())try:self.initImageListViewer()except Exception as e:log_message('initImageListViewer() error: %s' % e.__cause__)self.tvImageView.clicked.connect(self.clickLoadImage)self.btnQuery.clicked.connect(self.initImageListViewer)self.btnExit.setStyleSheet('border: 0px;font-size: 20px')self.btnExit.clicked.connect(self.close)def initImageListViewer(self):self.today = self.edtDate.date().toString('yyyyMMdd')self.model = QStandardItemModel(0, 3)self.model.setHeaderData(0, Qt.Horizontal, '图片')self.model.setHeaderData(1, Qt.Horizontal, '测量值')self.model.setHeaderData(2, Qt.Horizontal, '文件名')self.tvImageView.setModel(self.model)self.tvImageView.setColumnWidth(0, 130)self.tvImageView.setColumnWidth(1, 200)self.tvImageView.setColumnWidth(2, 0)today_path = 'data/' + self.todaycreate_dir(today_path)data_list = sorted(os.listdir(today_path), reverse=True)self.lblNoData.setVisible(len(data_list) == 0)for data in data_list:if data.split('.')[1] != 'data':continuewith open(today_path + '/' + data, 'r') as f:line = f.readline()if line == '':continuedict_data = eval(line)value = dict_data['value']filename1 = dict_data['filename1']filename2 = dict_data['filename2'].split('.')[0]self.addItem('images/' + self.today + '/' + filename1.split('.')[0] + 'm.jpg','杯身高度:' + str(value[0]) + '\n时间:' + get_time_from_filename(filename1), filename1)self.addItem('images/' + self.today + '/' + filename2.split('.')[0] + 'm.jpg','\n'.join(['杯口最大直径:' + str(value[1]), '杯口最小直径:' + str(value[2]),'螺纹最大直径:' + str(value[3]), '螺纹最小直径:' + str(value[4]),'时间:' + get_time_from_filename(filename2)]), filename2)def addItem(self, image_path, description, filename):frame = cv2.imread(image_path)h, w, ch = frame.shapebytesPerLine = ch * wconvertToQtFormat = QImage(frame.data.tobytes(), w, h, bytesPerLine, QImage.Format_RGB888).rgbSwapped()pixmap = QPixmap.fromImage(convertToQtFormat)pixmap_item = QStandardItem()pixmap_item.setData(pixmap, Qt.DecorationRole)description_item = QStandardItem(description)filename_item = QStandardItem(filename)self.model.appendRow([pixmap_item, description_item, filename_item])def clickLoadImage(self, index: QModelIndex):try:row = index.row()image_name = self.model.item(row, 2).text()self.loadImage('images/' + self.today + '/' + image_name)except Exception as e:log_message('clickLoadImage() error: %s' % e.__cause__)def loadImage(self, image_file):scene = QGraphicsScene()self.graphicsView.setScene(scene)item = QGraphicsPixmapItem(QPixmap(image_file))scene.addItem(item)self.graphicsView.fitInView(item, Qt.KeepAspectRatio)def wheelEvent(self, event: QWheelEvent) -> None:if event.modifiers() & Qt.ControlModifier:factor = 1.1if event.angleDelta().y() < 0:factor = 1 / factorold_scale = self.graphicsView.transform().m11()new_scale = old_scale * factorif new_scale < 0.1 or new_scale > 1:returnself.graphicsView.scale(factor, factor)else:super().wheelEvent(event)def setWindowMiddle(self):screen = QApplication.primaryScreen()screen_geometry = screen.geometry()window_width, window_height = 1500, 960center_x = (screen_geometry.width() - window_width) // 2center_y = (screen_geometry.height() - window_height) // 2self.setGeometry(center_x, center_y - 20, window_width, window_height)def mousePressEvent(self, event: QMouseEvent) -> None:if event.button() == Qt.LeftButton:self.dragStartPosition = event.pos()def mouseMoveEvent(self, event: QMouseEvent) -> None:if self.dragStartPosition is not None:delta = event.pos() - self.dragStartPositionself.move(self.pos() + delta)def mouseReleaseEvent(self, event: QMouseEvent) -> None:if event.button() == Qt.LeftButton:self.dragStartPosition = Nonedef get_time_from_filename(filename):time_str = filename.split('.')[0]# time_str 20240929124900 转成 2024-09-29 14:49:00return (time_str[:4] + '-' + time_str[4:6] + '-' + time_str[6:8] + ' ' + time_str[8:10] + ':' +time_str[10:12] + ':' + time_str[12:14])def frmImageQueryExec():dialog = ImageQueryDialog()dialog.exec()

data文件内容:

{'filename1': '20241202142959-1.jpg', 'filename2': '20241202142959-2.jpg', 'value': ['236.952 mm', '98.734 mm', '97.934 mm', '90.052 mm', '89.211 mm'], 'result': 1}

images文件:

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

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

相关文章

Redis开发03:常见的Redis命令

1.输入以下命令&#xff0c;启动redis。 sudo service redis-server start 如果你是直接安装在WSL的&#xff0c;搜索栏搜索Ubuntu或者点击左下角Windows图表找到U那一栏&#xff0c;直接打开Ubentu&#xff0c;输入账密后&#xff0c;输入“sudo service redis-server start”…

JAVA |日常开发中常见问题归纳讲解

JAVA &#xff5c;日常开发中常见问题归纳讲解 前言一、语法错误相关问题1.1 分号缺失或多余1.2 括号不匹配1.3 变量未定义或重复定义 二、数据类型相关问题2.1 数据类型不匹配2.2 整数溢出和浮点数精度问题 三、面向对象编程相关问题3.1 空指针异常&#xff08;NullPointerExc…

ubuntu的用户使用

ubuntu系统中的常规用户登录方式 在系统root用户是无法直接登录的,因为root用户的权限过大所以其安全性比较差 在登录系统时一般使用在安装系统时建立的普通用户登录 如果需要超级用户权限: Ubuntu用户密码破解 在系统安装完成后默认grub启动等待时间为0&#xff0c;建议改…

初始Python篇(6)—— 字符串

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 字符串的常见操作 格式化字符串 占位符 f-string 字符串的 format 方法 字符串的编码与解码 与数据验证相关的方法 …

38 基于单片机的宠物喂食(ESP8266、红外、电机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52单片机&#xff0c;采用L298N驱动连接P2.3和P2.4口进行电机驱动&#xff0c; 然后串口连接P3.0和P3.1模拟ESP8266&#xff0c; 红外传感器连接ADC0832数模转换器连接单片机的P1.0~P1.…

GEE Landsat 8 可见光影像校正后下载

在遥感影像处理领域&#xff0c;Landsat 8 数据因其 30 米空间分辨率 和 多光谱波段 被广泛应用。处理这些数据时&#xff0c;研究者常常需要对数据进行裁剪、计算指数、图像增强等操作&#xff0c;以满足特定研究需求。 本文将介绍一个 Python 自动化脚本&#xff0c;使用 Goo…

Matlab Simulink HDL Coder开发流程(一)— 创建HDL兼容的Simulink模型

创建HDL兼容的Simulink模型 一、使用Balnk DUT模板二、从HDL Coder库中选择模块三、为DUT开发算法/功能四、为设计创建Testbench五、仿真验证设计功能六、Simulink模型生成HDL代码 这个例子说明了如何创建一个用于生成HDL代码的Simulink模型。要创建兼容HDL代码生成的MATLAB算法…

如何通过 JWT 来解决登录认证问题

1. 问题引入 在登录功能的实现中 传统思路&#xff1a; 登录页面时把用户名和密码提交给服务器服务器验证用户名和密码&#xff0c;并把检验结果返回给后端如果密码正确&#xff0c;则在服务器端创建 session&#xff0c;通过 cookie 把 session id 返回给浏览器 但是正常情…

像素流送api ue多人访问需要什么显卡服务器

关于像素流送UE推流&#xff0c;在之前的文章里其实小芹和大家聊过很多&#xff0c;不过今天偶然搜索发现还是有很多小伙伴&#xff0c;在搜索像素流送相关的问题&#xff0c;搜索引擎给的提示有这些。当然这些都是比较短的词汇&#xff0c;可能每个人真正遇到的问题和想获取的…

Uniad复现学习

在优云平台部署训练&#xff0c;加速训练。 关于UCloud(优刻得)旗下的compshare算力共享平台 UCloud(优刻得)是中国知名的中立云计算服务商&#xff0c;科创板上市&#xff0c;中国云计算第一股。 UCloud&#xff08;优刻得&#xff09;旗下的Compshare算力共享平台具有以下优点…

域名解析系统 DNS

1.域名系统概述 用户与互联网上某台主机通信时&#xff0c;必须要知道对方的IP地址。然而用户很难记住长达32 位的二进制主机地址。即使是点分十进制地址也并不太容易记忆。但在应用层为了便于用户记忆各种网络应用&#xff0c;连接在互联网上的主机不仅有P地址&#xff0c;而…

【软考网工笔记】网络基础理论——网络层

文章目录 中断处理过程数据包组装RIPRSVPipv4RIPv1 & RIPv2HFC 混合光纤同轴电缆&#xff08;Hybrid Fiber Coax&#xff0c;简称HFC&#xff09;BGP (边界网关协议)BGP-4 协议的四种报文ICMP 协议数字语音电子邮件协议MPLS 多协议标记交换ipv6DHCPDNS名称解析过程查询顺序…

go语言 Pool实现资源池管理数据库连接资源或其他常用需要共享的资源

go Pool Pool用于展示如何使用有缓冲的通道实现资源池&#xff0c;来管理可以在任意数量的goroutine之间共享及独立使用的资源。这种模式在需要共享一组静态资源的情况&#xff08;如共享数据库连接或者内存缓冲区&#xff09;下非 常有用。如果goroutine需要从池里得到这些资…

【Delphi】modbus-TCP 协议库

在日常开发中&#xff0c;也会遇到使用modbus的部件&#xff0c;比如温度控制器、读卡器等等&#xff0c;那么使用Delphi开发&#xff0c;也就必须遵守modbus-TCP协议&#xff0c;如果自己使用TCP控件写也没有问题&#xff0c;不过如果有开源的三方库&#xff0c;别人已经调试过…

【Git 操作】-- 将 fork master 分支的最新commit更新到自己的仓库

目录 1.举例 2. 配置上游仓库&#xff08;Upstream&#xff09; 3. 获取上游仓库的更新 4. 切换到你自己的 master 分支 5. 合并上游仓库的 master 分支 6. 解决冲突&#xff08;如果有的话&#xff09; 7. 推送更新到你自己的 GitHub 仓库 1.举例 当我们从 github 的 h…

Facebook的开源项目解析:推动开发者社区的技术进步

Facebook&#xff0c;作为全球领先的社交平台之一&#xff0c;其在技术领域的创新不仅体现在产品功能的实现上&#xff0c;也积极推动开源社区的发展。开源项目已经成为Facebook技术战略的重要组成部分&#xff0c;通过开源&#xff0c;Facebook不仅加速了技术进步&#xff0c;…

荣耀300系列革新发布:科技与美学的里程碑之作

2024年12月2日&#xff0c;全新一代荣耀300系列正式发布&#xff0c;新潮的环球旅拍发布会不仅展现了荣耀追求极致的创新理念&#xff0c;也标志着数字系列迎来科技体验以及美学设计的巨大升级。凭借荣耀领先行业的AI能力以及对底层科技创新的强大驱动&#xff0c;全新荣耀300系…

centos 7 离线安装postgis插件

前一段时间记录了下如何在centos7中离线安装postgresql&#xff0c;因为工作需要&#xff0c;我不仅要安装postgresql&#xff0c;还需要安装postgis插件&#xff0c;这篇文章记录下postgis插件的安装过程。 1. 安装前的参考 如下的链接都是官网上的链接&#xff0c;对你安装p…

ChatGPT/AI辅助网络安全运营之-数据解压缩

在网络安全的世界中&#xff0c;经常会遇到各种压缩的数据&#xff0c;比如zip压缩&#xff0c;比如bzip2压缩&#xff0c;gzip压缩&#xff0c;xz压缩&#xff0c;7z压缩等。网络安全运营中需要对这些不同的压缩数据进行解压缩&#xff0c;解读其本意&#xff0c;本文将探索一…

kube-proxy的iptables工作模式分析

系列文章目录 iptables基础知识 文章目录 系列文章目录前言一、kube-proxy介绍1、kube-proxy三种工作模式2、iptables中k8s相关的链 二、kube-proxy的iptables模式剖析1.集群内部通过clusterIP访问到pod的流程1.1.流程分析 2.从外部访问内部service clusterIP后端pod的流程2.1…