lie*_*ewl 1 c++ qt infinite-loop qpainter
我正在研究和修改冰箱磁铁的例子,我试图做的最后一件事是绘制一些应该在背景上的标签和线条.
在环顾四周试图找出如何绘制标签和线条之后,我了解到我可以覆盖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);
}
Run Code Online (Sandbox Code Playgroud)
ypn*_*nos 10
您正在将对象添加到窗口小部件树中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."));
Run Code Online (Sandbox Code Playgroud)