C ++ Qt5 QWidget绘制事件“连锁反应” - 如何实现无递归?

时间:2013-08-10 23:28:59

标签: c++ qt5 qwidget paintevent

说明:  我正在编写一个应用程序,它在带有VBoxlayout(“ScopeView”)的容器小部件中显示自定义QWidgets列表(即“ScopeWidget”)。

每个scopeWidget都有一个指向自己的数据源类(“Scope”)的指针。这些对象在逻辑上按组排列,即在一个组中的对象之间存在一些共享参数(“ScopeShared”)。  在检索(或准备)必须在scopeWidget上显示的数据时,需要这些参数。

更进一步:  scopeWidget需要两组参数:由“Scope”给出并由“ScopeGroup”给出。  scopeWidget可以通过用户操作更改组中的一些共享参数,从而使此组中“范围”所持有的所有先前检索的数据无效。  默认情况下,“范围”中没有可显示的数据。根据需要检索数据 - 当paintEvent发生时(这是问题的根源)。要在“范围”中获取可显示的数据,必须处理此特定组中的所有“范围”(这将为组中的所有“范围”生成可用数据)。

工作原理:  用户强制其中一个scopeWidgets更改组中的共享数据。进行这些更改后,此组中“范围”所持有的所有数据都将失效,因此更改事件将重新处理整个组。并为该组中的所有scopeWidgets调用update()。窗口小部件重新绘制。这有效......

问题:  ......是一个自然发生的paintEvent。当用户改变某些东西时 - 我知道这发生了,我可以在排列小部件更新之前处理scopeGroup。但是当“其他东西”(系统本身)执行绘制事件时,我需要在任何绘画发生之前处理整个组。  因此,paint事件不会直接绘制,而是执行scopeGroup处理,然后,它绘制具有绘制事件的窗口小部件,并为该组中的所有其他窗口小部件调用update() - 这反过来会导致新的绘制事件,导致下一个scopeGroup处理,一个paint()和update()用于其他窗口小部件,这会导致新的绘制事件 - 它最终成为递归重绘(和scopeGroup处理)

Lame解决方案:  flags - 自发绘制事件执行组处理,一个paint()用于请求窗口小部件,update()用于组中的其余窗口小部件,以及每个窗口小部件的设置标志。

这个伪代码描述了这种机制:

paintEvent(QWidget *w)
 {
 if(w->flag)
 {
 w->paint(); w->flag=0;
 }
 else
 {
 w->group()->process();
 w->paint();
 QWidget *x;
 foreach(x,group) if(x!=w) { x->flag=1; x->update(); }
 }

恕我直言会更好:

a)如果窗口小部件可以在没有事先绘制事件的情况下绘制(或调用update()或repaint())...这将是最好的;],但它不能以简单明了的方式工作 - 有没有另一种方式? - 或

b)强制系统调用自定义函数而不是paint事件

这些“更好”的解决方案是否可行?

0 个答案:

没有答案