gpt4 book ai didi

c++ - QWidget 的 paintEvent() 滞后应用程序

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:17:29 25 4
gpt4 key购买 nike

我正在研究和修改 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);
}

最佳答案

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

关于c++ - QWidget 的 paintEvent() 滞后应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2334673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com