首页 > 解决方案 > Qt 的 MVC 中的编程方法是什么,可以在相同数据上获取具有结构不同视图的小部件?

问题描述

我刚刚了解了 Qt 中的模型/视图概念,并提出了一个相当普遍的问题。

我了解如何使用模型将某些数据类型关联到适当的小部件,例如QAbstractListModel可以将列表关联到 aQListView或 a QComboBox

当多个小部件通过一个通用模型关联到相同的数据时,就会产生特殊的好处,例如 aQComboBox和几个QListViews 与同一个单一的QAbstractListModel.

我注意到,在教科书演示中,总是选择这种情况,以便小部件以相同的结构显示数据,例如 Combo 的条目和位置的 Listi都来自ieth 列表项,而不是来自总数据的内容。

我的问题是,一般来说,如何处理相同数据由不同小部件以完全不同的结构显示的情况,即条目(及其编号)是整个数据集的一般功能?

举一个(相当复杂的)例子,假设我的数据是一个整数列表,

my_list = [[1,2,3], [2,3,4,5]]

我想使用两个小部件显示它,如下所示:

QTableView

List      | Length | First Item
----------+--------+-----------
[1,2,3]   | 3      | 1
[2,3,4,5] | 4      | 2


QTreeView

+ [1,2,3]
   + Length
      + 3
   + First item
      + 1
   + Left-truncated Sublists
      + [2,3]
         + Length
            + 2
         + First item
            + 2
         + Left-truncated Sublists
            + [3]
               + This list very nice because it contains no 2
               + Length
                  + 1
               + First item
                  + 3
      + [3]
         + This list very nice because it contains no 2
         + Length
            + 1
         + First item
            + 3
+ [2,3,4,5]
   + Length
      + 4
   + First item
      + 2
   + Left-truncated Sublists
      + [3,4,5]
         + This list very nice because it contains no 2
         + Length
            + 3
         + First item
            + 3
         + Left-truncated Sublists
            + [4,5]
               + This list very nice because it contains no 2
               + Length
                  + 2
               + First item
                  + 4
               + Left-truncated Sublists
                  [5]
                   + This list very nice because it contains no 2
                   + Length
                      + 1
                   + First item
                      + 5
            + [5]
               + This list very nice because it contains no 2
               + Length
                  + 1
               + First item
                  + 5
      + [4,5]
         + This list very nice because it contains no 2
         + Length
            + 2
         + First item
            + 4
         + Left-truncated Sublists
            + [5]
               + This list very nice because it contains no 2
               + Length
                  + 1
               + First item
                  + 5
      + [5]
         + This list very nice because it contains no 2
         + Length
            + 1
         + First item
            + 5
+ there are 2 lists in total

当然,我不希望得到一个完整编码的详细答案,但是一些提示或资源会很好,如何使用Qt/中的 MVC 来解决这个问题PyQt

标签: pythonqtmodel-view-controllerpyqt

解决方案


这就是视图模型非常适合的地方。它们是代理模型:它们使源模型适应某种显示组织。您通常会从QAbstractProxyModel. 例如这里提供了一个简单的示例。


推荐阅读