Если вы создаете объект QPainter в стеке (то есть, не используя new
), как указано в документации:
void SimpleExampleWidget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setPen(Qt::blue);
painter.setFont(QFont("Arial", 30));
painter.drawText(rect(), Qt::AlignCenter, "Qt");
}
Тогда объект QPainter будет уничтожен, когда он выйдет из области видимости (в примере выше: в конце функции). Причина, по которой в документации упоминается, что вы должны быть осторожны при удалении объекта QPainter, заключается в том, что Qt не будет делать это само по себе, что немного отличается от многих методов управления виджетами Qt.
Итак, скажем, вы динамически распределили этот объект:
void SimpleExampleWidget::paintEvent(QPaintEvent *)
{
QPainter* painter = new QPainter(this);
painter->setPen(Qt::blue);
painter->setFont(QFont("Arial", 30));
painter->drawText(rect(), Qt::AlignCenter, "Qt");
// Delete object, since Qt wont do it for you:
delete painter;
}
Qt сообщает вам, что вы отвечаете за очистку объекта QPainter, что в нашем примере выполняется командой delete
. Однако, если вы используете этот подход, вы можете подумать о том, чтобы поместить его в умный указатель, т.е. boost::scoped_ptr<QPainter> painter = new QPainter(this);
void SimpleExampleWidget::paintEvent(QPaintEvent *)
{
boost::scoped_ptr<QPainter> painter = new QPainter(this);
painter->setPen(Qt::blue);
painter->setFont(QFont("Arial", 30));
painter->drawText(rect(), Qt::AlignCenter, "Qt");
}
Теперь, что касается правильного способа сделать это. Это зависит от того, как часто вам придется создавать объекты QPainter, если вы создаете их локально, как в примере? Если это приводит к дополнительным расходам, подумайте о создании QPainter в качестве переменной-члена и его повторном использовании. (Хотя, если вы беспокоитесь о скорости: «оптимизация на ранних этапах никогда не бывает хорошей идеей» - это то, что следует посвятить сердцу).
Если вы выделяете память динамически с помощью new
, помните, что вы также отвечаете за ее удаление. Если вы просто создадите его в стеке, как в самом верхнем примере, вам не нужно беспокоиться, так как он будет уничтожен всякий раз, когда выходит из области, в которой он был создан.