在 QTableView 中嵌入控件?
Posted
技术标签:
【中文标题】在 QTableView 中嵌入控件?【英文标题】:Embedding a control in a QTableView? 【发布时间】:2009-11-16 19:34:53 【问题描述】:我正在开发一个小型 qt 应用程序(使用 PyQt4),我想出了一个想法,但我不确定如何实现它。我有一个代表一些数据的 QTableView,我想向 QTableView 添加另一列,其中包含一个复选框控件,该控件可以连接到模型的某些部分。例如,像这样:
请注意,Delete 列的每一行都有一个复选框小部件(尽管这是一个 Web 应用程序,而不是桌面 Qt 应用程序,但原理是相同的)。如果我可以选择多行,则可以加分,右键单击,然后选择“选中/取消选中选中”。
如果有任何不清楚的地方,请在此处发表评论,我会澄清。
【问题讨论】:
【参考方案1】:实现你自己的表模型比使用QStandardItemModel
(正如@Andy 建议的那样)做更多的工作,但它确实让你可以很好地控制你想要做什么,所以我会试着给你一个总结去做。我假设您了解Qt's documentation 和PyQt's class documentation 的所有信息,并且可以查找您需要的任何课程。 (如果你已经有了QTableView
,我可能会过度解释,但我认为总比留下一些东西要好。)
要获得可检查的状态:
创建QTableModel
的子类。
选择一些数据结构来存储行的内容。这可以非常简单(一个很大的内部列表),也可以像 SQL 数据库一样复杂(在这种情况下,请参阅 QSqlTableModel
)。
覆盖 rowCount
、columnCount
、data
和 setData
。
rowCount
和 columnCount
直接对应于您用于数据模型的内容。如果您基本上使用的是二维数组(或列表列表),它们可以像单行一样短。
data
是事情变得有趣的地方。项目模型存储几个不同的字段(Qt 将其称为roles),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
。
要确定在某个操作后实际选择了哪些单元格,请询问表格视图的选择模型(注意'l'):view.selectionModel().selectedIndexes()
。您可以使用 for
循环遍历这些内容。
允许右键单击:
覆盖视图的contextMenuEvent
。
创建一个QMenu
并将其连接到您需要的任何插槽。
如果您还没有阅读,请阅读Qt guide to Model/View 以获得更深入的了解。一定要看看Qt item view examples。所描述的许多是在 PyQt 中以更少的代码实现的(包括两个@Jesse 提到的),树模型示例可以转移到表中,但工作量要少得多(如上所述,您需要实现的代码要少得多。)
【讨论】:
【参考方案2】:您还可以查看 QStandardItemModel,它为您提供了一个通过“可检查”状态与项目交互的界面!
您也可以从 QAbstractItemModel 继承并使用角色 Qt::CheckStateRole...
【讨论】:
【参考方案3】:在 Qt/C++ 中,您可以为列中的自定义项创建委托。我假设你可以在 PyQt 中做一些非常相似的事情。请参阅以下示例:
Star Delegate ExampleSpin Box Delegate Example
【讨论】:
以上是关于在 QTableView 中嵌入控件?的主要内容,如果未能解决你的问题,请参考以下文章