Ваш paintEvent
должен иметь возможность перекрасить весь виджет. Например, если пользователь минимизирует, а затем максимизирует ваше приложение, весь виджет должен быть перекрашен. QPaintEvent::region
может использоваться для подавления некоторой части этой живописи, если эти операции рисования дороги. Вот образец. (Это только подтверждение концепции. В приведенном ниже коде есть много «плохих идей», не последним из которых является то, что в этом случае стоимость тестирования региона не стоит. Но это, по крайней мере, показывает логика.)
#include <QtGui>
class PaintWidget : public QWidget {
Q_OBJECT
public slots:
void AddPoint() {
QPoint point(rand() % width(), rand() % height());
points_ << point;
update(point.x() - 3, point.y() - 3, 6, 6);
}
protected:
void paintEvent(QPaintEvent *event) {
qDebug() << Q_FUNC_INFO;
QPainter painter(this);
painter.setPen(Qt::SolidLine);
foreach (QPoint point, points_) {
if (event->region().contains(point)) {
qDebug() << "drawing point:" << point;
painter.drawEllipse(point, 2, 2);
}
}
}
private:
QVector<QPoint> points_;
};
int main(int argc, char** argv) {
QApplication app(argc, argv);
PaintWidget w;
w.show();
QTimer timer;
timer.connect(&timer, SIGNAL(timeout()), &w, SLOT(AddPoint()));
timer.start(1000);
return app.exec();
}
#include "main.moc"
Обратите внимание, что если вы оставляете программу видимой, она рисует отдельные точки с каждым событием рисования. Но если вы пропустите другое окно перед своим или свернете / развернете приложение, многие точки будут нарисованы в одном событии рисования.
Что касается рисования точек, трудно понять, как рассмотрение региона может принести большую пользу. Но если ваши географические точки составили QPainterPath
или что-то в этом роде, вы можете получить некоторое повышение производительности.
Надеюсь, это поможет!