QT:QGraphicsView未从内部循环更新
我试图从一个无限循环中反复地在屏幕上画一幅画。当我尝试将图片绘制到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
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);
}