2012-07-30 59 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