[英]QPaintEvent - updating only a region of the screen
在我的代碼中,每次我的應用程序獲取 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);
}
您的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
或類似的東西,您可能會獲得一些性能優勢。
希望有幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.