2

ウィジェットの単純な階層があります: GraphWidget -> MotionWidget -> NodeWidget。私は Qt を初めて使用するので、一部の内部がどのように機能するかについてはまだよくわかりません。基本的に、GraphWidget は単一の MotionWidget Mを作成し、 M の親をそれ自体に設定します。その後、 Mは立ち去り、多数の NodeWidget を作成します。ただし、NodeWidgets がペイントされることも、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 番目のケースでは機能したのはなぜですか?

4

1 に答える 1

3

私はアイウアの答えに反対するつもりです。親をオブジェクトに渡すと、子がビジュアル階層に追加されます。(それ以外の場合、Designer を使用して他のものを含むウィジェットを作成することはできませんが、絶対位置を指定することはできません。) ただし、描画が行われない他の要因があった可能性があります。

MotionWidgetレイアウトが機能したという事実により、両方のバージョンでサイズが設定されていないと推測します。これは、最初の例では、0x0 ピクセルにサイズ設定されることを意味し、ペイントしようとすると Qt が最適化します。2 番目の例では、レイアウトは追加されたウィジェットのサイズを制御するため、大きくMotionWidgetなり、ペイント イベントを再び受け取り始めます。

これを修正するには、 の場合のようにサイズを明示的に設定するGraphWidgetか、親のサイズに基づいて動的なサイズ変更を行うかGraphWidget、サイズを制御するか、多数のさまざまなオプションのいずれかを制御します。レイアウトもいいかもしれませんが、絶対に必要というわけではありません。

于 2009-03-13T17:27:57.480 に答える