QWidget :: paintEventが呼び出されないのはなぜですか?
-
10-07-2019 - |
質問
ウィジェットの単純な階層があります:GraphWidget-> MotionWidget-> NodeWidget。私はQtが初めてなので、一部の内部がどのように機能するかについてはまだよくわかりません。基本的に、GraphWidgetは単一のMotionWidget M を作成し、 Mの親を自身に設定します。その後、 M はなくなり、NodeWidgetsの束を作成します。ただし、NodeWidgetはペイントされることも、paintEvent()関数が呼び出されることもありません。
GraphWidgetを使用せずにMotionWidgetを直接作成してみましたが、すべて機能します。それでは、GraphWidgetを階層に追加するとなぜ問題が発生するのですか?
ここに、私のプロジェクトの関連するコードを貼り付けます。 GraphWidget :: dumpObjectTree()からの出力も上部に含めました。
編集:リンクの貼り付けを忘れた;) http://rafb.net/p/Zp39CF94 .html
更新:MotionWidgetをレイアウトにラップしました。
前:
GraphWidget :: GraphWidget( QWidget *parent ) : QWidget( parent )
{
setFixedSize( 500, 500 );
MotionWidget *n = new MotionWidget( 5, this );
}
後
GraphWidget :: GraphWidget( QWidget *parent ) : QWidget( parent )
{
setFixedSize( 500, 500 );
QVBoxLayout *l = new QVBoxLayout;
MotionWidget *n = new MotionWidget( 5 );
l->addWidget( n );
setLayout( l );
}
現在、後者は機能します。つまりすべてが描かれます。質問は次のようになります...なぜですか?最初のケースでは機能しなかったが、2番目のケースでは機能したのはなぜですか?
解決
Aiuaの回答に同意しません。親をオブジェクトに渡すと、視覚的な階層に子が追加されます。 (そうでなければ、Designerを使用して他のウィジェットを含むウィジェットを作成しますが、絶対配置は機能しません。)ただし、おそらくペイントが行われないようにする他の要因がありました。
レイアウトによって機能するため、両方のバージョンで、 MotionWidget
にはサイズが設定されていないと思います。つまり、最初の例では、サイズを0x0ピクセルに設定し、ペイントしようとするとQtが最適化します。 2番目の例では、レイアウトはそれに追加されるウィジェットのサイズを制御するため、 MotionWidget
を拡大し、ペイントイベントの受信を再開します。
これを修正するには、 GraphWidget
の場合と同様にサイズを明示的に設定するか、親のサイズに基づいて動的なサイズ変更を行うか、 GraphWidget
で制御できますサイズ、または多数のさまざまなオプションのいずれか。レイアウトも便利ですが、必須ではありません。