1

私のコードでは、アプリが 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);
  }
4

1 に答える 1

3

ウィジェット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"

プログラムを表示したままにしておくと、ペイント イベントごとに個々のドットがペイントされることに注意してください。しかし、自分のウィンドウの前に別のウィンドウを渡すか、アプリケーションを最小化/最大化すると、1 回のペイント イベントで多くのポイントがペイントされます。

描画ポイントについては、領域を考慮することがどのように役立つかを理解するのは困難です。しかし、地理的なポイントが aQPainterPathまたはそのようなものを形成している場合、パフォーマンス上の利点が得られる可能性があります。

それが役立つことを願っています!

于 2011-08-05T01:37:42.663 に答える