如何在QT中的树视图项内渲染复杂的小部件?

Lev*_*Lev 9 qt delegates view

我有QT模型/视图框架的以下问题.我想在表视图项中呈现一个小部件.

首先我的想法是使用

void QAbstractItemView::setIndexWidget( const QModelIndex & index, QWidget * widget )
Run Code Online (Sandbox Code Playgroud)

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

此功能仅应用于显示与数据项对应的可见区域内的静态内容.如果要显示自定义动态内容或实现自定义编辑器窗口小部件,请改为子类QItemDelegate.

所以他们建议在这里使用代表.好吧,到目前为止一切顺利.我知道代理可能会用来创建一个编辑器,它基本上可以是任何QT小部件.但问题出在这里 - 我不希望这个小部件成为编辑器 - 我想总是用这个小部件渲染项目.而不只是"渲染",我需要它具有小部件的确切行为.

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

我考虑的解决方案是这样的:

  1. 将我的自定义小部件的外观抓取到像素图.
  2. 让委托使用这个像素图绘制自己.
  3. 当鼠标悬停在某个项目上时会导致视图自动开始编辑(我不
    知道该怎么做,但我想这是可能的)
  4. 让委托创建我的小部件作为项目的编辑器.

这个解决方案似乎有效,但它对我来说闻起来很糟糕.任何人都可以为这个问题更优雅的解决方案?

谢谢.

Kal*_*son 7

代表们负责创建编辑以及进行所有必要的展示.他们可能会使用样式来绘制大部分绘画,例如绘制进度条或手动绘制.

但是,委托不是小部件.除非调用了编辑器,否则它无法访问小部件所能做的大多数事情.这两者是非常不同的,有不同的目的,并完成不同的事情.

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

您可以控制何时使用编辑触发器调用编辑器,尽管您可以使用某些自定义代码(例如通过鼠标跟踪)来处理它.