QWidget :: resizeEvent()未在子子类中调用

时间:2012-07-30 07:17:23

标签: qt qwidget

我有以下代码段:

    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内成功完成相同的计算。现在,我的只是好奇心。

1 个答案:

答案 0 :(得分: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 macros

    告诉编译器为类添加Qt元对象代码(不是绝对必要的,以确保调用resizeEvent(),但是对于继承QObject的对象应该包含在内)。

  • 添加允许传入父对象并使用此父对象调用基类构造函数的构造函数,并在创建它们时将父对象传递给两个对象的构造函数

    来自the docs

      

    更改几何体时,窗口小部件如果可见,会立即收到移动事件(moveEvent())和/或resize事件(resizeEvent())。如果窗口小部件当前不可见,则保证在显示之前接收适当的事件。

    如果您的小部件没有设置父级,那么几何结构将毫无意义,因为xy部分指的是相对于父级的位置。最重要的是,由于小部件没有父母,因此无法将其视为应用程序的一部分,因此Qt无需拨打相应的resizeEvent()