QMainwindowのボタンでアクティブ化される別のウィンドウで構築されたQOGLWidgetウィジェットがあります。画像の表面をウィジェットからメインウィンドウのQOGLWidgetに送信しようとしていますが、画像がクラッシュし、最初のチャンスで例外アクセス違反が発生するという問題があります。
1 に答える
この状況で起こっている可能性があると私が考える3つのことがあります:
Qt::オートコネクション
フレーム ジェネレーターと GUI (SimulatorWindow + GLSimulatorWidget) の間の接続は、Qt::AutoConnectionによって接続され、別のスレッドに存在する場合、最終的にQt::DirectConnectionになります。この問題を解決するには、 Qt::QueuedConnectionの接続を指定します(実際に別のスレッドにある場合)。
QPixmap 対 QImage
GUIスレッドからQPixmapを処理している可能性があります。これは通常、警告を出力しますが、それでも機能する可能性があります。一般に、GUI スレッドにない画像を処理してから GUI スレッドに送信する場合は、QImageなどのQPixmap以外のものを使用する必要があります。
スタックでの初期化
フレーム オブジェクトは、GUI に到達するまでに範囲外になる可能性があります。たとえば、フレームを構築し、それをスタック上のローカル スコープに格納し、それをハンドラまたはコンテナに渡す場合...
...その後、GUI でオブジェクトを表現するためにローカル スコープを離れると、フレーム オブジェクトがなくなり、ハンドラー/コンテナーが不良ポインターを保持したままになります。
これを修正するには、ヒープに初期化し、Qt Object Modelに固執します。また、ヒープ上にコンテナーを、それらが属するクラスのメンバー変数としても作成するのが好きです。
要約すると、接続タイプを確認し、フレームジェネレーターが GUI スレッド上にあるかどうか、GUI 以外のスレッドにいる場合は QPixmap ではなく QImage を使用し、ポインターが範囲外に出ていないことを確認してください。