Estoy tratando de hacer un dibujo para la pantalla en varias ocasiones desde el interior de un bucle infinito. Cuando trato de dibujar la imagen a la QGraphicsView, no se actualiza a menos que romper con el bucle. Aquí está mi función con el bucle infinito:
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));
}
}
Y aquí es DisplayQImage()
:
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);
}
Tenga en cuenta que graphics_scene
y rendered_image
son miembros de MainWindow
. Si inserto una sentencia break después de mi llamada a DisplayQImage
continuación, el primer fotograma hace, pero si no sale de la displayNoise
función a continuación, el widget no se actualiza. He definido una señal de manera que cuando pulso N
que llama displayNoise
, y sé que el bucle es un bucle. ¿Por qué no se muestra la imagen?
Es porque usted no está dando el tiempo para hacerlo eventloop de cosa. Su función es llamada desde el eventloop, y la prestación se llama desde el mismo eventloop, porque viven en el mismo hilo. Así que tienes dos opciones:
- escribir el código de forma asíncrona, por ejemplo. con un QTimer.
- llamar manualmente el eventloop: https://doc.qt.io/qt-5/qeventloop.html#processEvents
Creo que la primera opción es probablemente la forma más agradable.