我正在使用一个小型qt应用程序(使用PyQt4),我想出了一个想法,但我不确定如何实现它。我有一个代表一些数据的QTableView,我想在QTableView中添加另一个列,其中包含一个可以连接到某个模型的复选框控件。例如,像这样:
请注意,删除列的每一行都有一个复选框小部件(虽然这是一个Web应用程序,而不是桌面Qt应用程序,但主体是相同的)。奖励点如果我可以选择多行,右键单击,然后选择“选中/取消选中所选项”。
如果其中任何一项不清楚,请在此处发表评论,我会澄清。
答案 0 :(得分:6)
实现自己的表模型比使用QStandardItemModel
更多的工作(如@Andy推荐的那样),但它确实可以很好地控制你想要做的事情,所以我会试着给你一个总结该怎么做我假设您完全了解Qt's documentation和PyQt's class documentation,并且可以查找您需要的任何课程。 (如果你已经有QTableView
,我可能会过度解释,但我认为这比留下一些更好。)
获得可检查状态:
QTableModel
的子类。
QSqlTableModel
)。rowCount
,columnCount
,data
和setData
。
rowCount
和columnCount
与您用于数据模型的内容直接对应。如果你基本上使用的是2D数组(或列表列表),它们可以像单行一样短。data
是事情变得有趣的地方。项目模型存储了几个不同的字段(Qt称之为角色),data
返回的内容取决于要求的角色。请注意,我将讨论返回内容的数据类型,但始终需要将其包含在QVariant
中。
Qt.DisplayRole
是表格单元格中显示的任何文本。这是您的实际数据,是目前常见的情况(因此这是默认角色)。Qt.CheckStateRole
是一个布尔值。返回Qt.Checked
将显示已选中的复选框,Qt.Unchecked
将返回未选中的复选框。如果您想要包含的列只是复选框,则只处理此角色。QVariant
。setData
与data
对称。您应该在data
:Qt.DisplayRole
中处理您为实际数据处理的角色,并为复选框处理Qt.CheckStateRole
。允许多个行和列以及单元格的选择。为此,您需要了解selection models。简短版本是:
view.setSelectionMode( QAbstractItemView.ContiguousSelection
)。这将让您突出显示连续的单元格。您也可以突出显示任意单元格:请参阅QAbstractView.SelectionMode
。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中做一些非常相似的事情。请参阅以下示例: