C++ C++;Qt5 QWidget绘制事件“;链式反应如何在没有递归的情况下实现?

C++ C++;Qt5 QWidget绘制事件“;链式反应如何在没有递归的情况下实现?,c++,qt5,qwidget,paintevent,C++,Qt5,Qwidget,Paintevent,简介: 我正在编写一个应用程序,它在带有VBoxlayout(“ScopeView”)的容器小部件中显示自定义QWidget(即“ScopeWidget”)列表 每个scopeWidget都有一个指向自己的数据源类(“Scope”)的指针。这些对象按逻辑分组排列,即一个组中的对象之间存在一些共享参数(“ScopeShared”)。 检索(或准备)必须显示在scopeWidget上的数据时需要这些参数 进一步: scopeWidget需要两组参数:分别由“Scope”和“ScopeGroup”给出

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

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

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

工作原理: 用户强制其中一个ScopeWidget更改组中的共享数据。进行这些更改后,此组中“Scope”所持有的所有数据都将无效,因此更改事件将重新处理整个组。并为此组中的所有ScopeWidget调用update()。小部件将被重新绘制。这可以

问题是: …是一个自发发生的绘制事件。当用户更改某些内容时–我知道发生了这种情况,我可以在排队更新小部件之前处理scopeGroup。但是当“其他内容”(系统本身)执行绘制事件时,我需要在任何绘制发生之前处理整个组。 因此,paint事件不直接绘制,而是执行scopeGroup处理,之后,它绘制具有绘制事件的小部件,并为该组中的所有其他小部件调用update(),这反过来会导致新的绘制事件,从而导致下一个scopeGroup处理、一个绘制()和更新()对于其他小部件,它会导致新的绘制事件–它最终会作为递归重新绘制(和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) 强制系统调用自定义函数,而不是绘制事件

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