1

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

在环顾四周试图弄清楚如何绘制标签和线条之后,我了解到我可以覆盖 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);
}
4

2 回答 2

10

您正在将对象添加到 Widget 树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."));
于 2010-02-25T14:38:01.657 回答
2

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

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

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

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

因为,Ypnos 给了你一个解决方案,我指的是他 :)

于 2010-02-25T14:43:48.857 回答