QPaintEvent - обновление только области экрана - PullRequest
1 голос
/ 02 августа 2011

в моем коде Я пытаюсь рисовать точки каждый раз, когда мое приложение получает координаты GPS. Точки перемещаются на «i» пикселей вправо и вниз. Я хотел бы, чтобы они оставались там нарисованными, но кажется, что весь экран всегда обновляется, хотя я использую параметр QRegion, который предназначен для указания области на экране, которая должна быть обновлена. Кто-нибудь может помочь, пожалуйста? Я действительно новичок в этом и не знаю, что не так.

Вот класс, который обрабатывает это действие:

GameField::GameField(QWidget *parent)
    : QWidget(parent)
{
   i=5;
   j=0;
   pen=new QPen(Qt::black, 1, Qt::SolidLine);
   painter= new QPainter(this);
}

void GameField::paintEvent(QPaintEvent *event)
{

painter.setPen(pen);
painter.drawPoint(i,i,1,1);


  }

void GameField::positionUpdated(QGeoPositionInfo position) {
  QGeoCoordinate coordinates;
  if (position.isValid()) {
    coordinates = position.coordinate();
  }
i=i+5;
QRegion region(QRect(i,i,5,5));
this->update(region);
  }

1 Ответ

3 голосов
/ 05 августа 2011

Ваш 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 или что-то в этом роде, вы можете получить некоторое повышение производительности.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...