Linux QT 中控件QTableView相应鼠标事件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux QT 中控件QTableView相应鼠标事件相关的知识,希望对你有一定的参考价值。

我使用的控件如上。我想实现的是,查数据库后,列出的数据中,左键单击某一行,用控件中的方法,可以取得鼠标单击这一行的 ID 号(ID是第一列的主键,唯一)。

下面的代码,我试过下面文字中代码,常报错出不来。

十四.获取QTableView中鼠标选择行信息
QModelIndex index = tableViewCustomer->currentIndex();
然后通过queryModelCustomer.record(index.row()).value("customerid")可获得选择行在数据库中的相关信息(queryModelCustomer为tableViewCustomer中setModel(&queryModelCustome)设置的QSqlQueryModel

重载QTableView从QAbstractItemView继承来的静态函数就kyle

按你的要去i,下面2个都可以

void activated ( const QModelIndex & index )
void clicked ( const QModelIndex & index )
参考技术A 不懂 关注.
lz 难道是 whu iss的人?

在 QTableView 中嵌入控件?

【中文标题】在 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

【讨论】:

以上是关于Linux QT 中控件QTableView相应鼠标事件的主要内容,如果未能解决你的问题,请参考以下文章

Qt入门系列开发教程高级控件篇QTableView表格视图

Qt QTableView 表格内添加控件

Qt窗口及控件-QTreeview/QTableView排序问题

Qt如何按比例分配QTableView的列宽并且充满整个控件

qtabelwidget怎么得到指定行和列的值

在 QTableView 中嵌入控件?