QT:QGraphicsView未从内部循环更新

QT:QGraphicsView未从内部循环更新,qt,Qt,我试图从一个无限循环中反复地在屏幕上画一幅画。当我尝试将图片绘制到QGraphicsView时,它不会更新,除非我中断循环。下面是我的无限循环函数: void MainWindow::displayNoise() { QImage noise(WIDTH, HEIGHT, QImage::Format_RGB32); float t = 0; while (true) { // Populate noise rendered_image

我试图从一个无限循环中反复地在屏幕上画一幅画。当我尝试将图片绘制到QGraphicsView时,它不会更新,除非我中断循环。下面是我的无限循环函数:

void MainWindow::displayNoise() {
    QImage noise(WIDTH, HEIGHT, QImage::Format_RGB32);
    float t = 0;

    while (true) {
        // Populate noise

        rendered_image = noise;
        DisplayQImage(rendered_image);
        t += 0.200;
        std::this_thread::sleep_for(std::chrono::milliseconds(200));
    }
}
下面是
DisplayQImage()


请注意,
graphics\u scene
rendered\u image
main窗口的成员。如果我在调用
DisplayQImage
后插入一个break语句,那么第一帧就会呈现,但是如果我没有退出
displayNoise
函数,那么小部件就不会更新。我设置了一个信号,当我按下
N
时,它会调用
displayNoise
,我知道循环正在循环。为什么图片不显示?

这是因为您没有给eventloop时间来完成它的任务。您的函数将从eventloop调用,渲染将从同一eventloop调用,因为它们位于同一线程中。所以你有两个选择:

  • 以异步方式编写代码,例如使用QTimer
  • 手动调用eventloop:

我认为第一种选择可能是最好的方法。

这是因为您没有给eventloop时间去做它的事情。您的函数将从eventloop调用,渲染将从同一eventloop调用,因为它们位于同一线程中。所以你有两个选择:

  • 以异步方式编写代码,例如使用QTimer
  • 手动调用eventloop:

我认为第一个选项可能是最好的方法。

在GUI线程中运行这样的循环是个坏主意。您不能从非主线程影响小部件,但不应在那里执行长同步操作。但是,对于某些需要立即更新的情况,也可以使用查看有关在GUI线程内运行这样的循环的示例。您不能从非主线程影响小部件,但不应在那里执行长同步操作。但对于某些需要立即更新的情况,也可以使用。请参见关于
void MainWindow::DisplayQImage(QImage &i)
{
    QPixmap pixmap(QPixmap::fromImage(i));
    graphics_scene.addPixmap(pixmap);
    graphics_scene.setSceneRect(pixmap.rect());
    ui->scene_display->setScene(&graphics_scene);
}