我正在研究和修改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);
}发布于 2010-02-25 22:38:02
您将在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."));发布于 2010-02-25 22:43:49
为什么没有在构造函数上绘制线条?
我认为它们是,但它们被下一次调用paintEvent()时“清除”了,在这个调用中,您不再画线了……
为什么paintEvent()会陷入无限循环?
我认为这可能与您的time->show()有关;每次调用paintEvent时,它都会被调用25次……我不确定这一点,但是,由于时间作为父窗口小部件,当你调用"show“时,可能它会在其父窗口上调用"show",从而触发paintEvent……你知道我的意思..。
既然Ypnos给了你一个解决方案,我指的是他:)
https://stackoverflow.com/questions/2334673
复制相似问题