Qt - 需要递归重绘,如何?

Posted

技术标签:

【中文标题】Qt - 需要递归重绘,如何?【英文标题】:Qt - Recursive repaint needed, how? 【发布时间】:2012-07-21 21:25:43 【问题描述】:

我有以下代码:

paintGL()


    if(mouse_was_clicked)
    
       ... do the color picking with openGL to identify a clicked element

       ... !!! now I need to call again paintGL() to switch the selected element from the 
              old one to the new one but I can't create a recursive cycle!
    
    else
    
       ... normal code to draw the scene and the selected element in red ...
    

正如线条所暗示的,我需要一种方法来再次调用绘制事件。有没有办法在不产生潜在活锁的情况下实现这一点?比如推迟一个新的绘画活动?

【问题讨论】:

没有深入了解你在做什么......你能不能设置一个标志,以便当它再次出现时你可以假标志并防止递归? 【参考方案1】:

如果您的paintGL() 中的控制流程如此简单,只需确保在每种情况下都执行当前位于else 块中的内容:

void MyWidget::paintGL()

    if(mouse_was_clicked)
    
        ... do the color picking with openGL to identify a clicked element
    

    ... normal code to draw the scene and the selected element in red ...

【讨论】:

【参考方案2】:

很难说清楚你在这里做什么。

如果您在paintGL 检测到鼠标按钮被点击时尝试设置显示小部件(颜色选择器),则您混淆了您的事件。您应该为处理鼠标单击进行单独的操作,该操作设置标志/变量并触发重绘。 IE,将鼠标事件处理移出重绘回调。

我很容易在这里误解了您的问题,但是……如果是这样,我深表歉意。

不过,作为一般规则,如果您发现自己需要在 QT 中进行递归重绘,那么您可能是在与系统对抗,而不是与系统一起工作。

【讨论】:

不完全是我想要的(简单得多),但感谢您的帮助和 +1 的努力

以上是关于Qt - 需要递归重绘,如何?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Qt5 中触发 QTableView 的重绘?

QT 重绘/重绘/更新/做某事

如何在窗口中重绘 Qt 窗口或 tabview

wpf如何判断在其它操作时,重绘使用禁止

android涂鸦工具,笔刷的定义,撤销与重绘

Qt重绘机制