2

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

替代文字

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

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

4

3 回答 3

8

实现自己的表模型比使用QStandardItemModel(正如@Andy 建议的那样)做更多的工作,但它确实让你可以很好地控制你想要做什么,所以我会试着给你一个关于做什么的总结。我假设您了解Qt 的文档PyQt 的类文档,并且可以查找您需要的任何类。(我认为,如果你已经有了一个QTableView但总比遗漏一些东西要好,我可能会过度解释。)

要获得可检查的状态:

  • 创建 的子类QTableModel
    • 选择一些数据结构来存储行的内容。这可以很简单(一个很大的内部列表),也可以像 SQL 数据库一样复杂(在这种情况下,请参阅QSqlTableModel)。
    • 覆盖rowCount, columnCount,datasetData.
      • rowCount并且columnCount相当直接地对应于您用于数据模型的内容。如果您基本上使用的是二维数组(或列表列表),它们可以像单行一样短。
      • data是事情变得有趣的地方。项目模型存储了几个不同的字段(Qt 将其称为角色),data返回的内容取决于所要求的角色。请注意,我谈论的是返回的数据类型,但它总是需要包装到QVariant.
        • Qt.DisplayRole是表格单元格中显示的任何文本。这是您的实际数据,并且是迄今为止常见的情况(因此这是默认角色)。
        • Qt.CheckStateRole是一个布尔值。返回Qt.Checked将显示一个选中的复选框,并Qt.Unchecked返回一个未选中的复选框。如果您希望列包含的只是复选框,则仅处理此角色。
        • 其他角色对于图标、背景颜色和除此之外的许多其他功能很有用。
        • 任何未处理的角色都应该返回一个QVariant.
      • setData对称于data。您应该处理您处理的角色dataQt.DisplayRole实际数据和Qt.CheckStateRole复选框。

允许多选行、列和单元格。为此,您需要了解选择模型。简短的版本是:

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

要允许右键单击:

  • 覆盖您的视图的contextMenuEvent.
  • 创建一个QMenu并将其连接到您需要的任何插槽。

如需更深入的了解,请阅读Qt 模型/视图指南(如果您还没有的话)。并且一定要查看Qt 项目视图示例。所描述的许多是在 PyQt 中以更少的代码实现的(包括两个 @Jesse 提到的),树模型示例可以转移到表中,但工作量要少得多(如上所述,您需要实现的代码要少得多。)

于 2009-11-17T01:57:24.740 回答
4

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

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

于 2009-11-16T21:25:52.373 回答
1

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

Star 代表示例
Spin Box 代表示例

于 2009-11-16T19:47:47.533 回答