2012-07-30 108 views
2

我有下面的代码片段:了QWidget :: resizeEvent()的一个子子不叫

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

} 

调用上的A实例setGeometry将火resizeEvent()。在B的实例上调用setGeometry不会触发resizeEvent()。这有什么不对吗?

编辑: 我可以在setGeometry里面做同样的计算。现在,我只是好奇心。

+0

是否执行B :: resizeEvent()调用A :: resizeEvent()? – 2012-07-30 07:52:54

+0

是在执行B :: resizeEvent()时,我调用了A :: resizeEvent().B :: resizeEvent()没有被触发。根据文档调用B :: setGeometry()时,它应该被触发。 – Blackbelt 2012-07-30 07:58:09

回答

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() s的调用,但应包括用于其继承QObject为此事对象当然)。当它们被创建的构造,其允许在一个父对象的通过并调用基类的构造与此父对象并通过一个父对象到两个对象的构造的

  • 加成

    the docs

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

    如果你的部件没有父母设定的几何形状的一半毫无意义,因为xy部分是指相对于亲其位置。最重要的是,由于这些小部件没有父母,因此它们不能作为应用程序的一部分显示出来,所以Qt不会打扰调用适当的resizeEvent()

+0

对不起,我的帖子不完整。我已经在子类中添加了Q_OBJECT常量,并且每个构造函数都已经有一个父类。如果是的话,我不认为是父母问题,因为我应该在两个班上都尝试过相同的行为,我错了吗? – Blackbelt 2012-07-30 10:10:29

+0

不用担心:)如果你正在做我上面做的事情,你应该没有问题 - 你能否改变你的帖子以反映你的**精确**代码,包括与实施相关的任何事情? – sjwarner 2012-07-30 10:17:15

+0

我编辑了原文。 ty – Blackbelt 2012-07-30 10:25:26