循环刷新MainWindow模拟QT中QWidget的移动
Refreshing MainWindow in a loop to simulate a move of QWidget in QT
我是 QT 的新手,我的问题是循环刷新页面以在 QWidget 上移动。
详细地说,我有太多的点(它是一个椭圆所遵循的路径,它们将被绘制成线)并且我有一个椭圆将根据给定的两个点在屏幕上移动。在其移动过程中,路径会发生变化。因此,将根据新路径再次绘制线条,椭圆应遵循新路径。我做了如下操作:
void MainWindow::paint(...){
painter.drawEllipse(circle) //circle is QRectF
//Also I need to draw lines according to pathPlanned
}
bool MainWindow::replan(){
//it calculates the planned path and if the ellipse does not reached the destination it can change the planned path here
}
void MainWindow::execute(){
while(replan()){
for (it = plannedPath->begin(); it != plannedPath->end(); it++){
//Lines should be redraw according to new pathPlanned
}
circle(...) // new position of ellipse is changed here
// I tried to put QThread::msleep(10) but I learned that it blocks GUI and then deleted it.
}
}
我的问题是循环运行得太快(像往常一样)并且在完成所有操作之前无法刷新页面。然后立即在目的地上绘制椭圆。我看不到椭圆的动作。
我该如何解决?
不使用 QThread::msleep(10),而是使用以下
QEventLoop loop;
QTimer::singleShot(100, &loop, SLOT(quit()));
loop.exec();
这将在每次重绘椭圆后处理事件,因此 UI 将得到更新
为此您需要使用 Qt animation framework。官方文档中有很多示例。在这种情况下,您不会阻塞主事件循环,并且您的动画会很流畅。
如果您使用自定义绘图,请不要忘记调用 QWidget::repaint()
或 QWidget::update()
来刷新小部件内容。
不要在主线程中使用长时间循环。使用定时器+槽。
我是 QT 的新手,我的问题是循环刷新页面以在 QWidget 上移动。
详细地说,我有太多的点(它是一个椭圆所遵循的路径,它们将被绘制成线)并且我有一个椭圆将根据给定的两个点在屏幕上移动。在其移动过程中,路径会发生变化。因此,将根据新路径再次绘制线条,椭圆应遵循新路径。我做了如下操作:
void MainWindow::paint(...){
painter.drawEllipse(circle) //circle is QRectF
//Also I need to draw lines according to pathPlanned
}
bool MainWindow::replan(){
//it calculates the planned path and if the ellipse does not reached the destination it can change the planned path here
}
void MainWindow::execute(){
while(replan()){
for (it = plannedPath->begin(); it != plannedPath->end(); it++){
//Lines should be redraw according to new pathPlanned
}
circle(...) // new position of ellipse is changed here
// I tried to put QThread::msleep(10) but I learned that it blocks GUI and then deleted it.
}
}
我的问题是循环运行得太快(像往常一样)并且在完成所有操作之前无法刷新页面。然后立即在目的地上绘制椭圆。我看不到椭圆的动作。 我该如何解决?
不使用 QThread::msleep(10),而是使用以下
QEventLoop loop;
QTimer::singleShot(100, &loop, SLOT(quit()));
loop.exec();
这将在每次重绘椭圆后处理事件,因此 UI 将得到更新
为此您需要使用 Qt animation framework。官方文档中有很多示例。在这种情况下,您不会阻塞主事件循环,并且您的动画会很流畅。
如果您使用自定义绘图,请不要忘记调用 QWidget::repaint()
或 QWidget::update()
来刷新小部件内容。
不要在主线程中使用长时间循环。使用定时器+槽。