QWidget的paintEvent()滞后应用程序

时间:2010-02-25 14:32:35

标签: c++ qt infinite-loop qpainter

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

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

试图弄清楚如何解决这个问题,我将绘制标签和线条的代码移动到了类的构造函数中。虽然只在应用程序上绘制了标签。之后,我将标签留在构造函数中,但将绘制线条的代码移回paintEvent()。它工作正常,线条按预期绘制,只有在拖动时才调用paintEvent()。

为什么没有在构造函数上绘制线条,以及为什么paintEvent()进入无限循环?

这是应该绘制标签和线条的片段:

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);
}

2 个答案:

答案 0 :(得分:9)

您在paintEvent()期间将对象添加到窗口小部件树。这被认为是失败的。用于损坏和绘图的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."));

答案 1 :(得分:2)

为什么没有在构造函数上绘制线条?

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

为什么paintEvent()进入无限循环?

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

既然,Ypnos给了你一个解决方案,我就指他:)