2

スクリーンショットをソケットからビットマップとして受信し、それらの1つだけを表示すると機能しますが、ループに入ると(すべての受信画像を表示してムービーを作成します)ハングします

void ShowImageBuffer(char* buf,int sizeofimagebuffer )
{
    QByteArray byte=QByteArray::fromRawData(buf, sizeofimagebuffer );
    QPixmap  image;
    if(image.loadFromData(byte,"BMP"))
    {
        ui->label->setPixmap(image);
        ui->label->update();
    }
}



  while(1)
 {
        ShowImageBuffer(buf, sizeofimagebuffer)
 }

別のスレッドを使用する必要がありますか?(しかし、GUI を変更するためにスレッドを使用しないと思いますか?)

リアルタイムにするなら何がいい?

4

1 に答える 1

2

問題は、この方法でイベント ループに戻らないことです。使用しているupdate()メソッドは、QWidget をすぐに再描画しません。エリアを更新するリクエストをスケジュールし、他の保留中のリクエストがあればそれと統合します。この要求は、実行がイベント ループに戻るときに処理されます。ドキュメントに明確に記載されています。

QTimer を使用して、特定のフレーム レートで ShowImageBuffer メソッドを呼び出したい場合があります。ShowImageBuffer が終了すると、実行がイベント ループに戻り、update() リクエストを処理する時間が与えられます。AJG85 によって提案された改善も検討してください。

それ以外の場合は、すぐに paintEvent() メソッドを呼び出すrepaint()メソッドを見ることができますが、それでも良い結果を得るには特定のフレーム レートを設定する必要があると思います。私はQTimerの方法で行きます。

于 2012-08-17T18:03:52.147 に答える