【问题标题】:QWidget's paintEvent() lagging applicationQWidget 的paintEvent() 滞后应用程序
【发布时间】:2010-02-25 14:32:34
【问题描述】:

我正在研究和修改fridge magnets 示例,我尝试做的最后一件事是绘制一些应该在背景上的标签和线条。

在环顾四周试图弄清楚如何绘制标签和线条之后,我了解到我可以重写 QWidget 的 paintEvent() 来做到这一点。但是在我这样做之后,应用程序变得迟钝,我发现这是因为在看似无限的循环中调用了paintEvent()。

为了弄清楚如何解决这个问题,我将绘制标签和线条的代码移到了类的构造函数中。不过,只有标签被绘制在应用程序上。之后,我将标签留在了构造函数中,但将绘制线条的代码移回了paintEvent()。它起作用了,线条按预期绘制,并且仅在拖动东西时才调用paintEvent()。

为什么没有在构造函数上画线,为什么paintEvent()会陷入死循环?

这是用来绘制标签和线条的 sn-p:

QPen pen(Qt::lightGray, 0, Qt::SolidLine, Qt::SquareCap, Qt::RoundJoin);
QPainter paint(this);
paint.setPen(pen);
int scale = 20;
for(int x=0; x<25; x++){
    QString timetext= "0"+QString::number(x)+":00";
    QLabel *time= new QLabel(timetext,this);
    time->move(x*scale,2);
    time->show();
    paint.drawLine(x*scale,12,x*scale,400);
}

【问题讨论】:

    标签: c++ qt infinite-loop qpainter


    【解决方案1】:

    您在paintEvent() 期间将对象添加到小部件树。那被认为是失败的。用于damage&drawing 的Qt 调度程序将看到必须绘制一个新的孩子并尝试管理它,并且很可能循环是结果。如果您覆盖paintEvent(),则在同一个对象中进行所有绘画!黄金法则:paintEvent() 仅用于绘画!不适用于创建对象或其他任何东西。

    这样做:

    QFont font(painter.font());
    font.setBold(true);
    painter.setFont(font);
    painter.fillRect(rect(), Qt::black);
    painter.setPen(Qt::white);
    painter.drawText(rect(), Qt::AlignCenter, tr("White text on dark background. Awesome."));
    

    【讨论】:

    • 我应该将所有绘图代码从构造函数中移出并移到paintEvent中吗?
    • 是的,绘图只能在paintEvent()中完成。或者您可以绘制作为小部件背景的 QPixmap(大多数情况下为 QLabel)。然后你只会画一次(在一段时间内),而不是触摸paintEvent() 本身。这取决于您的应用程序。请注意,在paintEvent() 中(重新)进行绘图工作并不像人们想象的那么昂贵。在大多数情况下,Qt 使用双缓冲,因此简单地移动窗口不会导致paintEvent()。另一方面,例如在远程会话中,双缓冲无效。
    【解决方案2】:

    为什么没有在构造函数上画线?

    我认为它们是,但在下一次调用 paintEvent() 时它们被“擦除”了,此时你不再画线了......

    为什么paintEvent()会陷入死循环?

    我觉得可能和你的时间有关->show();每次调用paintEvent时都会调用25次...我不确定,但是由于作为小部件作为父级的时间,当您调用“show”时,它可能会在其父级上调用“show”,因此触发paintEvent。 ...你知道我的意思...

    既然 Ypnos 给了你解决方案,我就参考他 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-29
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      相关资源
      最近更新 更多