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"

请注意,如果您让程序可见,它会在每个绘制事件中绘制单独的点。但是,如果您通过您前面的另一个窗口,或者最小化/最大化应用程序,则在一个绘制事件中绘制了许多点。

对于绘图点,很难看出考虑该地区会有多大好处。但是,如果您的地理点形成一个QPainterPath或类似的东西,您可能会获得一些性能优势。

希望有帮助!

于 2011-08-05T01:37:42.663 回答