其他分享
首页 > 其他分享> > c – Qt paintEvent崩溃

c – Qt paintEvent崩溃

作者:互联网

我试图在我的小部件上绘制简单的板.

当我试图自动化时,我的paintEvent崩溃了.我认为它是由for循环引起的,我是对的吗?如何以其他方式绘画?

void Widget::paintEvent(QPaintEvent *event)
{
QPixmap myPix( QSize(20,20) );
QPainter painter(this);
for(int i = 0; i < 100; i+5){
    painter.drawLine(QPointF(i,0),QPointF(i,max));
}
this->setPixmap(myPix);
}

解决方法:

你的for循环不正确并导致程序崩溃(我确定这不是你的错).它应该写成这样:

for(int i = 0; i < 100; i+=5){
    p.drawLine(QPointF(i,0),QPointF(i,max));
}

即分配增量.这样它就可以完成工作并正确完成.

另外,我建议使用drawPixmap()而不是setPixmap().但是setPixmap()不会导致无限递归,例如下一代码正常工作.

//...
this->setPixmap(QPixmap("G:/2/qt.jpg"));
QLabel::paintEvent(event);

为什么?使用这种方法永远不会产生无限递归(见here):

If you call repaint() in a function which may itself be called from
paintEvent(), you may get infinite recursion. The update() function
never causes recursion.

的确,setPixmap()调用update(),而不是repaint().要证明看到源代码:

setPixmap source:

void QLabel::setPixmap(const QPixmap &pixmap)
{
    Q_D(QLabel);
    //...
    d->updateLabel();//what it does?
}

updateLabel source:

void QLabelPrivate::updateLabel()
{
    Q_Q(QLabel);
    //...
    q->updateGeometry();
    q->update(q->contentsRect());//not repaint

}

正如我所说,这不是一个错误,但我认为如果你能用QPainter做你需要的所有东西会更好.

标签:c,for-loop,qt,paintevent
来源: https://codeday.me/bug/20190824/1712802.html