2010-01-26 37 views
9

我有以下QT模型/视图框架的问题。我想在一个表视图项中渲染一个小部件。如何在QT中的树视图项目中呈现复杂的小部件?

首先我想到的是使用

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

但对于这个函数的文档明确规定:

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

所以他们建议在这里使用代表。那么,迄今为止这么好。我知道可以使用代表创建一个编辑器,这可能基本上是任何QT小部件。但是这里存在这个问题 - 我不希望这个小部件成为编辑器 - 我想要使用这个小部件始终呈现该项目。而不仅仅是“呈现”,我需要它具有小部件的确切行为。

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

我认为解决的办法是这样的:

  1. 抓住我的自定义部件的外观的像素图。
  2. 让委托使用此像素图绘制自己。
  3. 当鼠标移动到某个项目使视图自动启动编辑(我不
    知道如何做到这一点,但我想这是可能的)
  4. 让委托创建我的窗口小部件的编辑器一个物品。

此解决方案似乎可行,但对我来说味道不好。任何人都可以为这个问题提供更优雅的解决方案?

谢谢。

+0

你是什么意思“我需要它具有小部件的确切行为? – 2010-01-26 19:59:01

+0

我的意思是与用户进行交互 - 对其行为做出反应 – Lev 2010-01-26 20:55:59

+0

你想要什么样的交互?一个细胞,它不是,所以我有一个很难想象你真正想要在交互方式的控件。 – 2010-01-26 21:40:24

回答

7

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

但是,代表不是小工具。除非编辑器已被调用,否则它无法访问小部件的大部分内容。两者非常不同,目的不同,并且完成不同的事情。

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

尽管您可以通过一些自定义代码(例如通过鼠标跟踪)来处理它,但您可以通过edit triggers来调用编辑器。

+0

同意。所以基本上你说的,那我会往好的方向发展?顺便说一句,悬停事件将不帮助我在这里,因为小部件是只有当编辑被触发(在此之前,小部件不存在)的委托创建。 – Lev 2010-01-26 20:15:18

+1

您可以使用组成,抱到小部件的引用,然后使用'QWidget的::渲染()'绘制到代理的paint方法中绘制的像素图。 – 2010-01-26 21:39:18

相关问题