2

次のスニペットがあります。

    class A : public QWidget
    {
       Q_OBJECT
   public:
     A(QWidget *parent = 0);

     void
     setGeometry(int x, int y, int w, int h);

      protected:
       virtual void
       resizeEvent(QResizeEvent *event);

    }

    class B : public A
    {
       Q_OBJECT
   public:
     B(A*parent = 0);   

     void
    setGeometry(int x, int y, int w, int h);

   protected:
     virtual void
     resizeEvent(QResizeEvent *event);
    }

void
A::setGeometry(int x, int y, int w, int h) 
{
    QWidget::setGeometry(x, y, w, h);
}

void
A::resizeEvent( QResizeEvent * event) 
{
    QWidget::resizeEvent(event);
    // common A and B stuff
}

void
B::setGeometry(int x, int y, int w, int h) 
{
    A::setGeometry(x, y, w, h);
}

void
B::resizeEvent( QResizeEvent * event) 
{
    A::resizeEvent(event);

}

setGeometryのインスタンスを呼び出すと、Aが発生しresizeEvent()ます。B のインスタンスでの呼び出しsetGeometryは発生しません resizeEvent()。これに問題はありますか?

編集:内部で必要な同じ計算をsetGeometry正常に実行できました。さて、私のものはただの好奇心です。

4

1 に答える 1

3

上記のスニペットにはいくつか問題があるため、いくつかの場所を変更しました...以下のコードは、必要な動作を生成するために最低限必要なコードです。

ヘッダ:

class TestA : public QWidget
{
  Q_OBJECT

  public:
    explicit TestA(QWidget *Parent = 0) : QWidget(Parent) {}
    ~TestA() {}

  protected:
    virtual void resizeEvent(QResizeEvent *);
};

class TestB : public TestA
{
  Q_OBJECT

  public:
    explicit TestB(QWidget *Parent = 0) : TestA(Parent) {}
    ~TestB() {}

  protected:
    virtual void resizeEvent(QResizeEvent *);
};

実装:

void TestA::resizeEvent(QResizeEvent *)
{
  qDebug() << "TestA Resize";
}

void TestB::resizeEvent(QResizeEvent *)
{
  qDebug() << "TestB Resize";
}

MainWindow::MainWindow(QWidget *parent) :
  QMainWindow(parent),
  ui(new Ui::MainWindow)
{
  ui->setupUi(this);

  TestA* A = new TestA(this);
  TestB* B = new TestB(this);

  A->setGeometry(0,0,100,100);
  B->setGeometry(200,200,100,100);
}

変更点:

  • クラス定義へのQ_OBJECTマクロの追加:

    クラスの Qt メタオブジェクト コードを追加するようにコンパイラに指示します ( resizeEvent()s が確実に呼び出されるようにするために厳密に必要というわけではありませんが、継承するオブジェクトにQObjectは当然含まれている必要があります)。

  • 親オブジェクトの受け渡しを許可し、この親オブジェクトを使用して基本クラス コンストラクターを呼び出し、かつ作成時に 2 つのオブジェクトのコンストラクターに親オブジェクトを渡すコンストラクターの追加:

    ドキュメントから:

    ジオメトリを変更すると、ウィジェットが表示されている場合、移動イベント (moveEvent()) および/またはサイズ変更イベント (resizeEvent()) をすぐに受け取ります。ウィジェットが現在表示されていない場合、表示される前に適切なイベントを受け取ることが保証されます。

    ウィジェットに親が設定されていない場合、xおよびyパーツは親に対する相対的な位置を参照するため、ジオメトリは半分意味がありません。その上、ウィジェットには親がないため、アプリケーションの一部として表示できないため、Qt は適切な を呼び出す必要がありませんresizeEvent()

于 2012-07-30T09:51:20.910 に答える