在 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)。 覆盖 rowCountcolumnCountdatasetDatarowCountcolumnCount 直接对应于您用于数据模型的内容。如果您基本上使用的是二维数组(或列表列表),它们可以像单行一样短。 data 是事情变得有趣的地方。项目模型存储几个不同的字段(Qt 将其称为roles),data 返回的内容取决于所要求的角色。请注意,我谈论的是返回的数据类型,但它总是需要包装到 QVariant 中。 Qt.DisplayRole 是表格单元格中显示的任何文本。这是您的实际数据,并且是迄今为止最常见的情况(因此这是默认角色)。 Qt.CheckStateRole 是一个布尔值。返回Qt.Checked 将显示一个选中的复选框,Qt.Unchecked 将返回一个未选中的复选框。如果您希望列包含的只是复选框,则仅处理此角色。 其他角色可用于图标、背景颜色和许多其他功能,但这些除外。 任何未处理的角色都应返回QVariantsetDatadata 对称。您应该处理您在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 中嵌入控件?的主要内容,如果未能解决你的问题,请参考以下文章

qt 中Qtable widget中如何加一个表

如何在 Pyqt4 中设置 QTableView 标头名称

QT - QTableView removeRow() 崩溃

QT控件之Qtable Widget

如何在pyqt4的右侧对齐qtableview行?

如何在 QTableView 中绘制自定义控件?