A. Kriegman:
私は無限ループ内からを繰り返し、画面に絵を描くようにしようとしています。私は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()
:
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);
}
なお、graphics_scene
およびrendered_image
のメンバーですMainWindow
。私は私のコールの後にbreak文を挿入した場合DisplayQImage
、最初のフレームはレンダリングが、私は終了していない場合はdisplayNoise
機能し、その後ウィジェットは更新されません。私は私が押したときほど、信号を設定するN
ことが呼び出したdisplayNoise
、と私はループがループしている知っています。なぜ画像が表示されていませんか?
デビッド・ライン川:
あなたはそれのことを行うためのイベントループの時間を与えていないからです。あなたの関数はイベントループから呼ばれている、と彼らは同じスレッドに住んでいるのでレンダリングは、同じイベントループから呼び出されます。だから、2つのオプションがあります。
- 例えば、asyncronous方法であなたのコードを記述します。QTimerと。
- :手動イベントループを呼び出すhttps://doc.qt.io/qt-5/qeventloop.html#processEventsを
私は最初のオプションは、おそらく最も素晴らしい方法だと思います。