qt 移动时间调用move出现坐标抖动的问题
时间: 2023-09-30 20:04:50 浏览: 92
在Qt中,移动QGraphicsItem对象时,可能会出现坐标抖动的问题,这是由于移动的时间间隔和移动的距离不完全匹配导致的。为了解决这个问题,可以使用QElapsedTimer类来计算移动的时间,并根据移动的距离和时间来计算移动的速度。
以下是一个示例代码,它使用QElapsedTimer和QTimer来移动一个圆形QGraphicsEllipseItem对象,避免了坐标抖动的问题。
```cpp
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsEllipseItem>
#include <QTimer>
#include <QElapsedTimer>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// Create a scene and view
QGraphicsScene scene;
QGraphicsView view(&scene);
// Create a circle item
QGraphicsEllipseItem *circle = new QGraphicsEllipseItem(0, 0, 50, 50);
circle->setBrush(Qt::red);
scene.addItem(circle);
// Create a timer to move the circle
QElapsedTimer elapsedTimer;
QTimer timer;
QObject::connect(&timer, &QTimer::timeout, [&]() {
if (!elapsedTimer.isValid()) {
elapsedTimer.start();
return;
}
qreal deltaTime = elapsedTimer.nsecsElapsed() / 1000000000.0;
elapsedTimer.restart();
qreal speed = 100.0; // pixels per second
qreal distance = speed * deltaTime;
circle->setPos(circle->pos() + QPointF(distance, distance));
});
timer.start(10);
view.show();
return a.exec();
}
```
在此示例中,我们使用QElapsedTimer来计算移动的时间,然后根据速度和时间计算移动的距离。在QTimer的timeout信号中,我们检查QElapsedTimer是否有效,如果无效则启动它。然后,我们计算移动的时间并重启QElapsedTimer对象。接下来,我们使用计算出的距离来移动圆形QGraphicsEllipseItem对象的位置。
请注意,此示例中的速度值为100像素/秒,你可以根据需要调整此值。
阅读全文