Qt paintEvent аварийно завершает работу


Я пытаюсь нарисовать простую доску на моем виджете.

Когда я пытаюсь автоматизировать это, мой paintEvent выходит из строя. Я думаю, что это вызвано петлей внутри, я прав? Как же его раскрасить по-другому?

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);
}
1   3   2014-11-19 14:33:29

1 ответ:

Ваш цикл 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);

Почему? При таком подходе бесконечная рекурсия является никогда не производилось (см. здесь):

Если вы вызываете repaint() в функции, которая сама может быть вызвана из paintEvent (), вы можете получить бесконечную рекурсию. Функция обновления никогда не вызывает рекурсии.

Действительно setPixmap() вызывает update(), а не repaint(). Чтобы доказать это, смотрите исходный код:

SetPixmap источник:

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

UpdateLabel источник:

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

}
Как я уже сказал, это не ошибка, но я думаю, что будет лучше, если вы будете делать все, что вам нужно с QPainter.