1

Win 7 で 5.0.2 を使用する

[QWidget を拡張する] 2 つの「ImageLoop」クラスがあり、それぞれが画面の半分を占め、垂直に分割されます。それぞれに、jpg ファイルのリストを表示するための QLabel が含まれています。したがって、for ループ内で、各ウィジェットに画像のリストを与え、2 つのウィジェットのそれぞれのスロット「playList」に接続した「listfull」シグナルを発行します。残念ながら、最初のウィジェットのみが更新されるため、最初のウィジェットのシグナルのみが発行されるようです。

Qt プログラミングは初めてで、スロット/シグナル システムを誤解している可能性があります。以下の疑似コードは、インスタンスごとにリストを埋め、シグナルを発し、各インスタンスは楽しい方向に進みます。基本的に、各ウィジェットは同時に独立して画像を表示します。それで、質問は私が欠けているものですか?それとも、これらをそれぞれ独自のスレッドで生成する必要がありますか?

ありがとう!

疑似コード

for(int i=0; i<2; i++){
     Create ImageLoop instance
     connect(instance, SIGNAL(listfull()), instance, SLOT(playList()));
     instance->FillList(arrayOfImageFileNames);
}

//inside of ImageLoop class
void FillList(arrayOfImageFileNames) {
     //adds all files to an internal list
    //when finished
     emit listfull();
}

//inside of ImageLoop class
void playList() {
     //code to loop through each image and show it
}
4

1 に答える 1

0
for(int i=0; i<2; i++){
 Create ImageLoop instance
 connect(instance, SIGNAL(listfull()), instance, SLOT(playList()));
 instance->FillList(arrayOfImageFileNames);
}

この疑似コードは、両方の imageLoop インスタンスで playList() を非同期的に呼び出すと想定しています。代わりに、Qt が listFull を playList に直接接続し、この疑似コードを次のようにします。

for(int i=0; i<2; i++){
 Create ImageLoop instance
 instance->FillList(arrayOfImageFileNames);
 instance->playList();
}

私の推測では、playList も同期的です。つまり、終了し、for ループが 2 番目の ImageLoop インスタンスに続くことを意味します。

Qt では、複数の GUI スレッドを使用することも、複数のスレッドから GUI を更新することもできません。そのため、次の画像を表示するには、画像を表示して非同期に信号を送信する必要があります。

おそらく、実際に必要なのは、fillList() が完了したときにタイマーを開始し、特定の遅延の後にスロット showNextImage() を呼び出すことです。

于 2013-07-27T03:04:49.957 に答える