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);
}

3

Решение

Ваш цикл 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 (), вы можете получить бесконечную рекурсию. Функция update ()
никогда не вызывает рекурсию.

В самом деле 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,

6

Другие решения


По вопросам рекламы [email protected]