qt - 如何在 QT 中的 TreeView 项中呈现复杂的小部件?

标签 qt delegates view

QT 模型/ View 框架存在以下问题。我想在表格 View 项中呈现一个小部件。

首先我的想法是使用

void QAbstractItemView::setIndexWidget( const QModelIndex & index, QWidget * widget )

但是这个函数的文档明确指出:

This function should only be used to display static content within the visible area corresponding to an item of data. If you want to display custom dynamic content or implement a custom editor widget, subclass QItemDelegate instead.



所以他们建议在这里使用委托(delegate)。嗯,到目前为止一切顺利。我知道委托(delegate)可以用来创建一个编辑器,它基本上可以是任何 QT 小部件。但问题是——我不希望这个小部件成为编辑器——我想始终使用这个小部件呈现项目。而不仅仅是“渲染”,我需要它具有小部件的确切行为。

现在我要使用的小部件是一个自定义小部件,它是一些其他小部件的容器(很少有复选框,有一些布局的按钮)。

我考虑的解决方案是这样的:
  • 将我的自定义小部件的外观抓取到像素图。
  • 让代理使用此像素图绘制自己。
  • 当鼠标悬停在一个项目上时, View 会自动开始编辑(我不
    知道怎么做,但我想这是可能的)
  • 让委托(delegate)创建我的小部件作为项目的编辑器。

  • 这个解决方案似乎有效,但对我来说很难闻。任何人都可以为这个问题提供更优雅的解决方案吗?

    谢谢。

    最佳答案

    Delegates负责creating editors以及做所有必要的展示。他们可能会使用样式来完成大部分绘画,例如绘制进度条或手动绘画。

    但是,委托(delegate)不是小部件。除非调用了编辑器,否则它无法访问小部件的大部分内容。两者非常不同,目的不同,完成的事情也不同。

    委托(delegate)最麻烦的方面之一是他们是 静态 .除非模型中的某些内容触发了更新(或者小部件被配置为监视悬停事件),否则委托(delegate)将不会用于重绘任何存在的数据——缓冲的表示将被绘制到屏幕上。

    您可以控制何时使用 edit triggers 调用编辑器,尽管您绝对可以使用一些自定义代码来处理它,例如通过鼠标跟踪。

    关于qt - 如何在 QT 中的 TreeView 项中呈现复杂的小部件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2142161/

    相关文章:

    sql - SQL Server 中的 View

    c++ - Qt 将数据从 form1 发送到 form2 TreeView 组件

    c++ - 从 QT 中的 C++ 代码访问 QML 元素

    c# - 我可以为多个基于表单的事件分配一个方法吗?

    C#:创建具有 bool 返回类型的多播委托(delegate)

    android - 如何制作像 Gmail 中的首字母缩写图标?

    android - 如何开发这个菜单(在图片上)

    c++ - 停止 Qt QGraphicsView 在调整大小时滚动

    c++ - 从另一个线程关闭 QTcpSocket

    c# - 为许多控件调用委托(delegate)