Qt:自定义 QListView 和实时控件

Posted

技术标签:

【中文标题】Qt:自定义 QListView 和实时控件【英文标题】:Qt: Custom QListView and live controls 【发布时间】:2012-03-28 14:23:24 【问题描述】:

我的自定义 QListView 有代表来绘制项目。我想为某些行项目(如 QLineEdit)添加一个实时控件,该控件将始终存在于行中,并且会随着列表自动正确滚动。

由于项目不是小部件,我不能将控件指定为“项目”的子级,因此滚动会将控件留在 QListView 小部件内的固定位置。

还有其他方法吗? 这可能吗?

【问题讨论】:

【参考方案1】:

通常,当QEvent::EnterEditFocus 事件发生时,编辑小部件由委托创建(和定位),然后在随后的QEvent::LeaveEditFocus 发生时销毁,并将数据发送回模型。然后,委托应使用新的模型数据重新绘制。

您能否详细说明“实时”控件的含义?

为什么要让编辑小部件不断打开?我认为更好的方法是创建一个委托,以您想要的方式绘制普通视图(即Qt::DisplayRole)。假设您正确地创建了子类视图,当模型更改时,委托仍应更新。

如果你真的想做你所要求的,我怀疑你可以通过:

创建您自己的项目委托(子类化QAbstractItemDelegate) 重新实现createEditor() 以使用QLineEdit 然后使用委托的updateEditorGeometry()

首先阅读模型/视图编程简介的Delegate Classes 部分。 Spin Box Delegate Example 和 Pixelator Example 如果您还没有学习过,也值得学习。

【讨论】:

listView 中的每一行都类似于即时通讯工具的行。每行代表一个联系人。它也有一些按钮。这些按钮是“手绘”的,因为您不能只将 QPushButtons 放在 listviewRow 上。滚动根本行不通。一些联系人行需要密码,例如输入密码,以便可以使用按钮。我想在其中一个按钮旁边放一个小编辑框。而且我不希望用户“双击/单击”以使编辑框出现在那里。我希望编辑框始终存在并使用 listView 正确滚动。 在我看来这是一个更适合自定义 QWidgets 而不是 QListView 的问题。或者可能是 QTableView,或者 QAbstractItemView 的子类。 可能。我只是没有时间发明一个完整的“能够每行托管实时 QWidgets 的 QListView”概念。我希望有一种方法可以利用当前的基础设施来完成这项工作。 为什么不直接创建一个带有所有控件的“用户”小部件,然后将该小部件添加到现有(可滚动)布局小部件中? 如何访问那个可滚动的小部件?

以上是关于Qt:自定义 QListView 和实时控件的主要内容,如果未能解决你的问题,请参考以下文章

如何自定义 QListView 的显示

Qt实现QQ好友下拉列表(用QListView实现,所以还得定义它的Model)

Qt入门系列开发教程QSSqss的实例

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

Qt之QListView使用

如何在 Qt 中自定义列表视图