首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QWidget的paintEvent()应用程序滞后

QWidget的paintEvent()应用程序滞后
EN

Stack Overflow用户
提问于 2010-02-25 22:32:35
回答 2查看 2.7K关注 0票数 1

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

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

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

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

下面是用于绘制标签和线条的代码片段:

代码语言:javascript
复制
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);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-02-25 22:38:02

您将在paintEvent()期间将对象添加到小部件树中。这被认为是失败的。损伤和绘制的Qt调度器将看到必须绘制一个新的子级,并尝试管理它,很可能循环就是结果。如果覆盖paintEvent(),则在同一对象中完成所有绘制!金科玉律:paintEvent()只用于绘画!不是用来创建对象或其他任何东西的。

如下所示:

代码语言:javascript
复制
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."));
票数 10
EN

Stack Overflow用户

发布于 2010-02-25 22:43:49

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

我认为它们是,但它们被下一次调用paintEvent()时“清除”了,在这个调用中,您不再画线了……

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

我认为这可能与您的time->show()有关;每次调用paintEvent时,它都会被调用25次……我不确定这一点,但是,由于时间作为父窗口小部件,当你调用"show“时,可能它会在其父窗口上调用"show",从而触发paintEvent……你知道我的意思..。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2334673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档