我正在使用一个小型的qt应用程序(使用PyQt4),我想出了一个想法,但我不确定如何实现它。我有一个QTableView代表一些数据,我想向QTableView添加另一列,其中包含一个复选框控件,可以连接到模型的某个部分。例如,像这样:在QTableView中嵌入控件?
注意删除列有各行的复选框控件(虽然这是一个web应用程序,而不是一个桌面应用程序的Qt,主要是相同的)。如果我可以选择多行,点击右键,然后选择“选中/取消选中”。
如果有任何不清楚的地方,请在这里留言,我会澄清。
我正在使用一个小型的qt应用程序(使用PyQt4),我想出了一个想法,但我不确定如何实现它。我有一个QTableView代表一些数据,我想向QTableView添加另一列,其中包含一个复选框控件,可以连接到模型的某个部分。例如,像这样:在QTableView中嵌入控件?
注意删除列有各行的复选框控件(虽然这是一个web应用程序,而不是一个桌面应用程序的Qt,主要是相同的)。如果我可以选择多行,点击右键,然后选择“选中/取消选中”。
如果有任何不清楚的地方,请在这里留言,我会澄清。
实现自己的表模型比使用QStandardItemModel
(如@Andy建议)更多的工作,但它确实给你罚款控制你想做什么,所以我会试着给你一个做什么的总结。我假设你知道Qt's documentation和PyQt's class documentation的全部内容,并且可以查找你需要的任何类。 (我可能会overexplaining如果你已经有了一个QTableView
但不是让出来的东西好,我想。)
为了得到辨认的状态:
QTableModel
一个子类。
QSqlTableModel
)。rowCount
,columnCount
,data
和setData
。
rowCount
和columnCount
与您用于数据模型的内容相当直接。如果您基本上使用二维数组(或列表清单),则它们可以短至一行。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提到的)实现的,而树模型示例继承到表,但工作量少得多(如上所述,您需要实现更少的工作)。
在Qt/C++中,您可以为列中的自定义项目创建委托。我会假设你可以在PyQt中做类似的事情。请参见下面的例子:
你也可以看看在QStandardItemModel,让您通过“可检查”状态的项目进行交互的界面!
你也可以从化QAbstractItemModel继承和使用Qt的作用:: CheckStateRole ...