2009-11-16 42 views
2

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

alt text

注意删除列有各行的复选框控件(虽然这是一个web应用程序,而不是一个桌面应用程序的Qt,主要是相同的)。如果我可以选择多行,点击右键,然后选择“选中/取消选中”。

如果有任何不清楚的地方,请在这里留言,我会澄清。

回答

6

实现自己的表模型比使用QStandardItemModel(如@Andy建议)更多的工作,但它确实给你罚款控制你想做什么,所以我会试着给你一个做什么的总结。我假设你知道Qt's documentationPyQt's class documentation的全部内容,并且可以查找你需要的任何类。 (我可能会overexplaining如果你已经有了一个QTableView但不是让出来的东西好,我想。)

为了得到辨认的状态:

  • 创建的QTableModel一个子类。
    • 选择一些数据结构来存储行的内容。这可能非常简单(一个大的内部列表),或者像SQL数据库一样复杂(在这种情况下,请参阅QSqlTableModel)。
    • 替代rowCount,columnCount,datasetData
      • rowCountcolumnCount与您用于数据模型的内容相当直接。如果您基本上使用二维数组(或列表清单),则它们可以短至一行。
      • data是事情变得有趣的地方。项目模型存储几个不同的字段(Qt呼叫角色)以及data返回的内容取决于要求的角色。请注意,我会讨论返回的数据类型,但总是需要将其包装为QVariant
        • Qt.DisplayRole是任何文本显示在表的单元格中。这是您的实际数据,并且是常见情况(因此这是默认角色)。
        • Qt.CheckStateRole是一个布尔值。返回Qt.Checked将显示一个选中的复选框,Qt.Unchecked将返回一个未选中的复选框。如果所有你想要包含的列是复选框只处理这个角色。
        • 其他角色对于图标,背景颜色以及其他许多功能都很有用。
        • 任何未处理的角色应返回QVariant
      • setData对称于data。您应该处理您在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提到的)实现的,而树模型示例继承到表,但工作量少得多(如上所述,您需要实现更少的工作)。

3

你也可以看看在QStandardItemModel,让您通过“可检查”状态的项目进行交互的界面!

你也可以从化QAbstractItemModel继承和使用Qt的作用:: CheckStateRole ...