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);

}

调用will firesetGeometry的实例。调用B 的实例不会触发 。这有什么问题吗?AresizeEvent()setGeometryresizeEvent()

编辑:我可以成功地进行我需要的相同计算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 元对象代码(对于确保调用 s 不是绝对必要的,但对于继承的对象当然resizeEvent()应该包括在内)。QObject

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

    文档

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

    If your widgets don't have parents setting the geometry is half meaningless, as the x and y parts refer to its position relative to a parent. On top of that, since the widgets have no parents they can't be visible as part of the application so Qt doesn't bother to call the appropriate resizeEvent().

于 2012-07-30T09:51:20.910 回答