QPaintEvent -只更新屏幕的一个区域
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
或类似的东西,您可能会获得一些性能优势。
希望有帮助!
相关文章:
- 创建一个类来访问和指定向量类型,并构建一个获取位置并为其分配区域的类
- 为 pcl::P ointCloud 数据指定一个区域并获取可用点数
- QWT仅重点一个特定区域
- 有选择地启用一个并行区域内的OpenMP进行循环
- 查找一个区域中未包含在另一个区域中的第一个元素
- 使用wxWidget创建一个带有浮雕的矩形区域
- 无法正确访问在另一个类的私人区域内声明的类
- 尝试在Qt中仅更新小部件中的一个矩形,但整个小部件的区域都会更新
- c++linux控制台清除屏幕的一个区域
- 将一个映像的区域复制到另一个映像中的另一个区域
- 如何选择一个像魔杖一样的区域,并使用OpenCV进行泛洪填充
- 如何检测并在眼睛的虹膜区域周围画一个圆圈
- 需要用android opencv在柜台区域绘制一个矩形
- OpenGL:如何剪辑一个2D区域,以避免文本与GlutBitmap被打印出该区域
- 如何标记一个区域,使叮当格式不会碰到它?
- 如何创建一个可以随时间扩展的共享内存区域?
- 给定一个矩形区域和一组矩形,检查它们是否覆盖了整个区域
- QT: leaveEvent -检查光标是否在一个小部件的区域
- 请给我一些建议,如何评估一个最大的区域,涵盖所有给定的区域
- QPaintEvent -只更新屏幕的一个区域