在我的代码中我每次尝试获取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);
}
答案 0 :(得分: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
或类似的地理点,您可能会获得一些性能优势。
希望有所帮助!