在QTableView中嵌入控件?

时间:2009-11-16 19:34:54

标签: python qt pyqt4 tableview

我正在使用一个小型qt应用程序(使用PyQt4),我想出了一个想法,但我不确定如何实现它。我有一个代表一些数据的QTableView,我想在QTableView中添加另一个列,其中包含一个可以连接到某个模型的复选框控件。例如,像这样:

alt text

请注意,删除列的每一行都有一个复选框小部件(虽然这是一个Web应用程序,而不是桌面Qt应用程序,但主体是相同的)。奖励点如果我可以选择多行,右键单击,然后选择“选中/取消选中所选项”。

如果其中任何一项不清楚,请在此处发表评论,我会澄清。

3 个答案:

答案 0 :(得分:6)

实现自己的表模型比使用QStandardItemModel更多的工作(如@Andy推荐的那样),但它确实可以很好地控制你想要做的事情,所以我会试着给你一个总结该怎么做我假设您完全了解Qt's documentationPyQt's class documentation,并且可以查找您需要的任何课程。 (如果你已经有QTableView,我可能会过度解释,但我认为这比留下一些更好。)

获得可检查状态:

  • 创建QTableModel的子类。
    • 选择一些数据结构来存储行的内容。这可能非常简单(一个大的内部列表),或者像SQL数据库一样复杂(在这种情况下请参见QSqlTableModel)。
    • 覆盖rowCountcolumnCountdatasetData
      • rowCountcolumnCount与您用于数据模型的内容直接对应。如果你基本上使用的是2D数组(或列表列表),它们可以像单行一样短。
      • data是事情变得有趣的地方。项目模型存储了几个不同的字段(Qt称之为角色),data返回的内容取决于要求的角色。请注意,我将讨论返回内容的数据类型,但始终需要将其包含在QVariant中。
        • Qt.DisplayRole是表格单元格中显示的任何文本。这是您的实际数据,是目前常见的情况(因此这是默认角色)。
        • Qt.CheckStateRole是一个布尔值。返回Qt.Checked将显示已选中的复选框,Qt.Unchecked将返回未选中的复选框。如果您想要包含的列只是复选框,则只处理此角色。
        • 其他角色对于图标,背景颜色以及许多其他功能非常有用。
        • 任何未处理的角色都应返回QVariant
      • setDatadata对称。您应该在dataQt.DisplayRole中处理您为实际数据处理的角色,并为复选框处理Qt.CheckStateRole

允许多个行和列以及单元格的选择。为此,您需要了解selection models。简短版本是:

  • 在表格视图中设置选择模式view.setSelectionMode( QAbstractItemView.ContiguousSelection)。这将让您突出显示连续的单元格。您也可以突出显示任意单元格:请参阅QAbstractView.SelectionMode
  • 要确定在操作后实际选择了哪些单元格,请在表格视图中查询其选择模型(请注意'l'):view.selectionModel().selectedIndexes()。您可以使用for循环迭代这些。

允许右键单击:

  • 覆盖您的观看次数contextMenuEvent
  • 创建QMenu并将其连接到您需要的任何插槽。

要获得更深入的了解,请阅读Qt guide to Model/View(如果您还没有)。绝对看看Qt item view examples。许多描述都是在PyQt中以更少的代码(包括两个@Jesse提及)实现的,并且树模型示例延续到表但工作少得多(如上所述,您需要实现更少的工作)。 / p>

答案 1 :(得分:3)

您还可以查看QStandardItemModel,它为您提供了一个通过“可检查”状态与项目进行交互的界面!

您也可以从QAbstractItemModel继承并使用角色Qt :: CheckStateRole ......

答案 2 :(得分:1)

在Qt / C ++中,您可以为列中的自定义项创建委托。我想你可以在PyQt中做一些非常相似的事情。请参阅以下示例:

Star Delegate Example
Spin Box Delegate Example