2017-01-31 10 views
0

qt5 MinGw32を使用して客観的な注釈のツールを作成して、ビデオファイルのオブジェクトに注釈を付けて再生中に表示することができます。したがってQGraphicsSceneは、関数の実装に継承されます。qt5 QGraphicsScene setBackgroundBrush()は、頻繁に呼び出されたときに常に機能しません。

QGraphicsSceneの背景を頻繁に変更すると(30fpsな​​ど)、何か問題が発生します。ほとんどの場合、予想通りに動作し、背景が動かない場合があります。ここで

は私のコードです:

void MyGraphicsScene::UpdateFrame(QImage image) 
{ 
    QPixmap pixmap = QPixmap::fromImage(image); 

    //fix the view's size and scene's size 
    views().first()->setFixedSize(pixmap.size()); 
    setSceneRect(0,0, pixmap.width(), pixmap.height()); 

    setBackgroundBrush(QBrush(pixmap)); 
} 

... 

//In another thread 
void Thread::run() 
{ 
    ... 

    myScene.UpdateFrame(newImage); 

    ... 
} 

私はQtのドキュメントを検索し、何の答えを見つけていません。

しかし、奇妙なものがある:間違ったことが発生したときに

は、私は背景が変化し続ける見つけるが、私は別の画面にアプリを移動しない限り、それは、画面上の変化を示さなかった(私は2つを持っています画面)。しかし、アプリケーションを移動すると、QGraphicsSceneの背景は一度変更され、その後は静的になります。

バックグラウンドは変更されていますが再描画されないと思いますので、update()を使用しましたが、役に立たなかったです。

私は機会を再現することができませんでした、それは起こる、somtimesではありません。

どのような方法を表現する必要がありますか?あるいは私は方法を間違った方法で呼びましたか?それとも、別のアプローチがありますか?

ご協力いただきありがとうございます。

+0

投稿コードからは、非GUIスレッドで 'QPixmap'機能を使用しているようです。それは許可されていません(あなたはおそらくコンソールで警告を受けるべきです)。 –

+0

@ G.M。ありがとう。私はちょうど 'QImage'を使って' QPixmap'ではなくバックグラウンドを設定しています。しかし、私はなぜそれが起こるのかわからないので、バックグラウンドがもはや詰まっていないことを確認できませんでした。ところで、コンソールは何も暖かさを示していません。 – foo

答えて

0

メソッドを直接呼び出して、別のスレッドからQtGui要素を変更しないでください。

Qt信号スロットの概念を使用してください。 update()を呼び出す必要はありません。

class MyGraphicsScene{... 

.... 
signals: 
void singalFromThread(QImage image); 

public: 

//CTor 
MyGraphicsScene() 
{ 
connect(this, SIGNAL(singalFromThread(QImage)),this,SLOT(UpdateFrame(QImage))); 
} 

//Call this method from your thread 
void updateForwarder(QImage image) 
{ 
//Jump into gui thread 
emit singalFromThread(image); 
} 

public slots: 


void UpdateFrame(QImage image) 
{ 
setBackgroundBrush(....); 
} 


}; 
+0

ありがとう!!それは動作し、シーンはもはや立ち往生していないようです。ここでは別の質問です:私はfpsを制御することを望んでいるので、スロットは、信号スロットメカニズムを使用して直接不当な時間で呼び出されますか?例えばキュー内で非常に多くの信号が待機している場合、後でそのスロットを呼び出すのでしょうか? – foo

+0

異なるスレッドからの信号は、Qt Guiのメインスレッドイベントキューの最後に格納されます。したがって、データは失われません。毎秒60以上の信号を送信しないでください。標準のディスプレイには60 fpsしかありません。 – znoopy2k

関連する問題