繁体   English   中英

QWidget的paintEvent()滞后应用程序

[英]QWidget's paintEvent() lagging application

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

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

您需要在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."));

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

我认为是的,但是下一次对paintEvent()的调用将它们“擦除”了,在该调用中您不再画线了……

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

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

既然,Ypnos给您一个解决方案,我指的是他:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM