PyQt实现3维数组与界面TableWidget双向绑定

news2025/6/6 22:02:25

以下是一个使用PyQt实现3维数组与界面TableWidget双向绑定的示例代码。该程序包含一个下拉菜单选择第0维索引,表格展示第1维和第2维的数据,并支持双向数据同步:

import sys
import numpy as np
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, 
                             QComboBox, QTableWidget, QTableWidgetItem, QHeaderView)
from PyQt5.QtCore import Qt

class ArrayTableApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("3D Array Table Binding")
        self.setGeometry(100, 100, 600, 400)
        
        # 创建3D数组 (3x4x5)
        self.data_array = np.zeros((3, 4, 5), dtype=float)
        
        # 初始化一些测试数据
        for i in range(3):
            for j in range(4):
                for k in range(5):
                    self.data_array[i, j, k] = i * 100 + j * 10 + k
        
        # 创建UI
        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)
        self.layout = QVBoxLayout(self.central_widget)
        
        # 维度0选择下拉框
        self.dim0_combo = QComboBox()
        self.dim0_combo.addItems([f"维度0-{i}" for i in range(self.data_array.shape[0])])
        self.layout.addWidget(self.dim0_combo)
        
        # 表格展示维度1和维度2
        self.table = QTableWidget()
        self.table.setRowCount(self.data_array.shape[1])  # 维度1
        self.table.setColumnCount(self.data_array.shape[2])  # 维度2
        
        # 设置表头
        self.table.setHorizontalHeaderLabels([f"Col-{i}" for i in range(self.data_array.shape[2])])
        self.table.setVerticalHeaderLabels([f"Row-{i}" for i in range(self.data_array.shape[1])])
        
        # 表格自适应
        self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        self.layout.addWidget(self.table)
        
        # 连接信号
        self.dim0_combo.currentIndexChanged.connect(self.update_table)
        self.table.cellChanged.connect(self.update_array)
        
        # 初始化表格
        self.current_dim0 = 0
        self.update_table(0)
    
    def update_table(self, dim0_index):
        """根据选择的维度0索引更新表格"""
        self.current_dim0 = dim0_index
        
        # 断开信号防止编辑触发更新
        self.table.cellChanged.disconnect()
        
        # 更新表格数据
        for i in range(self.data_array.shape[1]):
            for j in range(self.data_array.shape[2]):
                value = self.data_array[dim0_index, i, j]
                item = QTableWidgetItem(f"{value:.2f}")
                item.setTextAlignment(Qt.AlignCenter)
                item.setData(Qt.UserRole, value)  # 存储原始值
                self.table.setItem(i, j, item)
        
        # 重新连接信号
        self.table.cellChanged.connect(self.update_array)
    
    def update_array(self, row, col):
        """表格编辑时更新数组数据"""
        item = self.table.item(row, col)
        if item is not None:
            try:
                # 尝试转换为浮点数
                new_value = float(item.text())
                self.data_array[self.current_dim0, row, col] = new_value
                
                # 更新显示格式
                item.setText(f"{new_value:.2f}")
            except ValueError:
                # 无效输入恢复原值
                orig_value = self.data_array[self.current_dim0, row, col]
                item.setText(f"{orig_value:.2f}")
        
        # 打印当前数组状态(调试用)
        print(f"数组更新:dim0={self.current_dim0}, row={row}, col={col}")
        print(f"新值:{self.data_array[self.current_dim0, row, col]:.2f}")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = ArrayTableApp()
    window.show()
    sys.exit(app.exec_())

代码说明:

  1. 数据结构

    • 使用NumPy创建3×4×5的三维数组
    • 初始化测试数据:每个元素值为 100 × i + 10 × j + k 100 \times i + 10 \times j + k 100×i+10×j+k
  2. 界面组件

    • QComboBox:选择第0维索引
    • QTableWidget:展示第1维和第2维数据(4行5列)
  3. 双向绑定机制

    • 数组到表格
      • 当下拉框选择变化时,update_table()方法加载对应维度的数据
      • 表格单元格使用QTableWidgetItem显示数据,保留原始值在UserRole
    • 表格到数组
      • 表格编辑触发cellChanged信号,调用update_array()
      • 验证输入有效性,无效时恢复原值
  4. 数据同步处理

    • 更新表格时暂时断开信号,避免循环触发
    • 单元格显示保留两位小数
    • 编辑时进行浮点数转换验证

功能特点:

  1. 维度0通过下拉菜单切换,实时更新表格内容
  2. 表格编辑后自动更新三维数组对应位置的值
  3. 输入验证机制防止非法输入
  4. 表格自适应窗口大小
  5. 数据变化实时打印到控制台(调试用)

使用说明:

  1. 运行程序显示3D数组查看器
  2. 通过顶部下拉菜单切换第一维度
  3. 在表格中双击单元格编辑数值
  4. 编辑后按Enter确认,数据会自动同步到后台数组
  5. 输入非数字内容会自动恢复之前的值

可以根据实际需求调整数组维度和初始化数据,此代码展示了PyQt中实现数据与UI双向绑定的核心模式。

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

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

相关文章

StoreView SQL,让数据分析不受地域限制

作者:章建(处知) 引言 日志服务 SLS 是云原生观测和分析平台,为 Log、Metric、Trace 等数据提供大规模、低成本、实时的平台化服务。SLS 提供了多地域支持【1】,方便用户可以根据数据源就近接入 SLS 服务&#xff0c…

UCRT 和 MSVC 的区别(Windows 平台上 C/C++ 开发相关)

UCRT 和 MSVC 是与 Windows 平台上 C/C 开发相关的两个重要概念,它们都属于 Microsoft 的开发工具链的一部分。下面详细解释它们的含义、区别以及用途。 一、UCRT(Universal C Runtime) 1. 含义: UCRT(Universal C …

rabbitmq Fanout交换机简介

给每个服务创建一个队列,然后每个业务订阅一个队列,进行消费。 如订单服务起个多个服务,代码是一样的,消费的也是同一个队列。加快了队列中的消息的消费速度。 可以看到两个消费者已经在消费了

JAVA-springboot JUnit单元测试

SpringBoot从入门到精通-第9章 JUnit单元测试 一、JUnit与单元测试 JUnit是一个开源的测试框架,虽然可以用于测试大多数编程语言的应用程序,但特别适合用于测试Java语言的应用程序。 软件测试一般分为4个阶段,即单元测试、集成测试、系统测…

PyCharm中运行.py脚本程序

1.最近在弄一个python脚本程序,记录下运行过程。 2.编写的python程序如下 # # Copyright 2017 Pixar # # Licensed under the terms set forth in the LICENSE.txt file available at # https://openusd.org/license. # # Check whether this script is being run …

[论文阅读] 人工智能+项目管理 | 当 PMBOK 遇见 AI:传统项目管理框架的破局之路

当PMBOK遇见AI:传统项目管理框架的“AI适配指南” 论文信息 arXiv:2506.02214 Is PMBOK Guide the Right Fit for AI? Re-evaluating Project Management in the Face of Artificial Intelligence Projects Alexey Burdakov, Max Jaihyun Ahn Subjects: Software …

Gateway 搭建

1.创建 moudle 命名为 gateway 2,pom中引入依赖 网关依赖&#xff1b;注册中心依赖等 <!-- 网关依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></d…

pytorch基本运算-导数和f-string

引言 在前序对机器学习的探究过程中&#xff0c;我们已经深刻体会到人工智能到处都有微分求导运算&#xff0c;相关文章链接包括且不限于&#xff1a; BP神经网络 逻辑回归 对于pytorch张量&#xff0c;求导运算必不可少&#xff0c;所以本次就专门来学习一下。 f-string的用…

5.RV1126-OPENCV 图形计算面积

一.图形面积、弧长计算介绍 前面我们已经把图形轮廓的检测、画框等功能讲解了一遍。这次主要结合轮廓检测的 API 去计算图形的面积&#xff0c;这些面积可以是矩形、圆形等等。图形面积计算和弧长计算常用于车辆识别、桥梁识别等重要功能&#xff0c;常用的 API 如 contourArea…

【Android基础回顾】一:Binder机制是什么?有什么用?

Android中的Binder机制是Android系统中最核心和最基础的进程间通讯机制。 1 什么是进程间通讯机制(IPC)&#xff1f; 众所周知&#xff0c;Android系统基于Linux开发&#xff0c;Linux系统里面本来就有进程间通讯机制。 1.1 Linux的IPC(Inter-Process Communication)概览 它…

LeetCode 高频 SQL 50 题(基础版) 之 【高级查询和连接】· 上

题目&#xff1a;1731. 每位经理的下属员工数量 题解&#xff1a; select employee_id,name,reports_count,average_age from Employees t1,(select reports_to,count(*) reports_count,round(avg(age)) average_agefrom Employeeswhere reports_to is not nullgroup by repor…

资产智慧管理安全监测中心

在数字经济高速发展的今天&#xff0c;资产管理的智能化已成为企业降本增效的核心竞争力。从智慧园区到古建筑群&#xff0c;从交通枢纽到城市电网&#xff0c;资产智慧管理安全监测中心正以物联网、人工智能、数字孪生等技术为支撑&#xff0c;构建起资产全生命周期的“智慧大…

从零开始的云计算——番外实战,iptables防火墙项目

目录 一网络规划 二项目要求 三环境准备 1防火墙设置 2PC1设置 3PC2设置 4服务器S1设置 四环境检测 1内网链接 2外网连接 五防火墙配置及测试 1内部网络中的pc1采用SNAT访问外部互联网&#xff0c;但是无法ping到内部网关。 ​编辑​编辑 2内部网络服务器s1通过DN…

【基于阿里云搭建数据仓库(离线)】IDEA导出Jar包(包括第三方依赖)

目录 方法一&#xff1a; 方法二 1.双击"package”即可进行打包呈jar 2.双击后就会自动打包生成jar了&#xff0c; 生成的jar在这个目录下 3.右击&#xff0c;点击“复制路径/引用”&#xff0c;即可获得“绝对路径”、“根路径”等相关信息 前提&#xff1a; 在pop.…

【物联网-TCP/IP】

物联网-TCP/IP ■ TCP/IP■■■ 添加链接描述 ■ TCP/IP ■ ■ ■

Halcon光度立体法

1、光度立体法&#xff0c;可用于将对象的三维形状与其二维纹理&#xff08;例如打印图像&#xff09;分离。需要用不同方向而且已知照明方向的多个光源&#xff0c;拍摄同一物体的至少三张图像。请注意&#xff0c;所有图像的相机视角必须相同。 物体的三维形状主要被计算为三…

cocos3.X的oops框架oops-plugin-excel-to-json改进兼容多表单导出功能

在使用oops框架的过程中&#xff0c;它的导出数据并生成数据结构的插件oops-plugin-excel-to-json有些小的坑点&#xff0c;为满足我个人习惯&#xff0c;对此部分进行了一个小的修改&#xff0c;有需要的拿去用&#xff0c;记录下供大家参考&#xff1b; 一、配置&#xff1a;…

每日八股文6.3

每日八股-6.3 Mysql1.COUNT 作用于主键列和非主键列时&#xff0c;结果会有不同吗&#xff1f;2.MySQL 中的内连接&#xff08;INNER JOIN&#xff09;和外连接&#xff08;OUTER JOIN&#xff09;有什么主要的区别&#xff1f;3.能详细描述一下 MySQL 执行一条查询 SQL 语句的…

Kubernetes (k8s)版本发布情况

Kubernetes (k8s)版本发布情况 代码放在 GitHub - kubernetes/kubernetes: Production-Grade Container Scheduling and Management https://github.com/kubernetes/kubernetes/releases 文档放在 kubernetes.io各个版本变更等: https://github.com/kubernetes/kubernet…

QT 5.9.2+VTK8.0实现等高线绘制

项目下载链接&#xff1a;QT5.9.2VTK8.0实现等高线绘制资源-CSDN文库 示例如下&#xff1a; 主要代码如下&#xff1a; #include "vtkRenderer.h" #include "vtkRenderWindow.h" #include "vtkRenderWindowInteractor.h" #include "vtkPo…