Python gui 表,其单元格是具有动态内容的下拉列表,其内容基于同一 gui 表的其他下拉列表单元格的内容
Posted
技术标签:
【中文标题】Python gui 表,其单元格是具有动态内容的下拉列表,其内容基于同一 gui 表的其他下拉列表单元格的内容【英文标题】:Python gui table whose cells are drop down lists with dynamic content based on the content of other drop-down-list-cells of the same gui-table 【发布时间】:2016-09-03 20:49:24 【问题描述】:我正在尝试将我用 Matlab 编写的小型 gui 应用程序移植到 Python 3.x。 该应用程序包含一个 Matlab uitable,您可以使用它对微控制器寄存器的位域进行编程。实际上,您可以创建一个面板,将一些对您很重要的寄存器位域进行分组,以便在特定时间点进行调试(编译器 IDE 中的一种监视窗口)。
看起来像这样: Gui Table used to write to register bitfields of a microcontroller
因此,表格的每一行都可用于对特定的寄存器位域进行编程。 有4列: 1.注册名称(下拉列表) 2. 位域名称(下拉列表) 3.要写入的值(字符串) 4. 格式(十六进制或十进制下拉列表,此处不相关)
为了使用这个应用程序,首先单击寄存器名称下拉列表,其中显示了所有寄存器(详细信息:使用文本框可以应用过滤器来缩小列表大小)。 选择寄存器时,位域列的下拉列表会自动更新,使其仅包含所选寄存器的位域。这在回调函数的帮助下发生。 然后,用户必须输入一个值和一个格式,并且只有当所有单元格都包含有效内容时,才会发出寄存器写入命令(通过一些调试器接口)。
这工作正常;有时位域列表实际上是表中添加的前一个寄存器之一,但这可以被检测到并清除条目,以便用户可以重试。另外当行数非常多出现滚动条时,如果用户尝试在底部输入一个寄存器,每次点击下拉列表,他们可以选择一个条目,然后滚动条位置会自动更改显示表格的开头。这使得输入寄存器的过程相当繁琐。据我所知,Matlab 的 uitable 没有可访问的属性来控制这种行为。
由于我是一名软件技术知识有限的硬件工程师,我想知道在 Python 3.x 中是否有一种自然的方式来支持这一点,比如使用一些可以自然映射到 gui 的结构化(例如 xml)数据容器组件,没有那么多回调编程和数据验证。理想的行为是用户开始直接在寄存器名称下拉列表中输入(在 Matlab 中不可能),并动态获取寄存器名称列表的过滤版本。
我对 python 完全陌生,刚刚安装了 Anaconda。我在 PyQt 中发现了一些有趣的类: QListView 类, QListWidget 类, QTableView 类, QTableWidget 类。
但是,我希望将 tableview 的功能与 listview 结合起来,就像 Matlab 中的 uitable 一样。或者更好的是,在输入几个字母后变成一个下拉列表的文本编辑输入。
pyqtgraph.tablewidget 似乎增强了 QTableWidget 的功能,但我认为这仍然不是我需要的。
所以,如果上述方法不可行,或者涉及繁重的编程,也许我只需要改变方法并有一个带有自动完成功能的单独搜索框,它可以查看寄存器数据库的“扁平化”版本,并且以 my_register_1.my_bitfield_1 形式返回结果(可能允许用户同时搜索寄存器和位域名称)。当用户单击“自动完成列表”中的一项时,所选条目将映射到 tableview 中当前选定的行,在只读表格单元格中添加寄存器名称和位域。 “要写入的值”单元格应该仍然是可编辑的,并且当它获得有效数据时应该触发寄存器写入命令...
如果你能指导我去哪里看,我将不胜感激。谢谢!
【问题讨论】:
【参考方案1】:您应该使用Qt model/view 架构。这允许您拥有数据的表示(“模型”),它与数据的表示方式(“视图”)是分开的。因此,您设置了一个数据表,然后设置了一个视图来表示该数据。当你在不同的数据集之间切换时,你告诉视图显示新的数据集。我链接到的教程详细解释了这一点
【讨论】:
以上是关于Python gui 表,其单元格是具有动态内容的下拉列表,其内容基于同一 gui 表的其他下拉列表单元格的内容的主要内容,如果未能解决你的问题,请参考以下文章