2012-10-26 187 views
0

我正在研究Qt4庫,我想在我的項目中爲QWidget的所有子項添加一些功能。我需要所有小部件覆蓋mousePressEvent。很顯然,我並不需要重寫它在每一個特定圖標我用(我用他們的許多我,他們遵循DRY規則),而不是我創建了一個Foo類:向類添加新功能

class Foo : public QWidget 
{ 
    Q_OBJECT 
    protected: 

     /* implementation is just a test */ 
     virtual void mousePressEvent(QMouseEvent*) { this->move(0,0); } 
}; 

而且從獲得我的按鈕它:

class FooButton : public QPushButton , public Foo 
{ 

    public: 
     FooButton (QWidget* parent) : QPushButton(parent) { }; 

}; 

但事件似乎沒有被重寫......我做錯了什麼? 在此先感謝。

+0

看起來你正在做的不便錯了!你不應該面對這個問題。爲什麼你需要改變_all_小部件的行爲? – Lol4t0

回答

1

您現在從QWidget繼承兩次。這是有問題的(見diamond problem)。

相反,放下你的Foo類和移動您的自定義鼠標按下事件處理您的FooButton類:

class FooButton : public QPushButton 
{ 
    Q_OBJECT 
protected: 

    /* implementation is just a test */ 
    virtual void mousePressEvent(QMouseEvent*) { this->move(0,0); } 

public: 
    FooButton (QWidget* parent) : QPushButton(parent) { }; 

}; 

如果不能滿足您的應用程序的設計,然後嘗試使用虛擬繼承來代替。也就是說,改變Foo到:

class Foo : public virtual QWidget 

如果沒有幫助,你應該遵循其他答案的諮詢和安裝事件處理程序。

(您可以在其Wikipedia article瞭解虛擬繼承。)

+0

我需要將它添加到我的項目中的所有類型的小部件中......多種類型的小部件....必須有另一種方法來解決這個問題... – Kolyunya

+0

@Kolyunya嘗試使用虛擬繼承。我更新了答案。 –

+1

虛擬繼承在這裏不起作用,因爲'QAbstractButton'實際上並不從'QWidget'繼承。 – ildjarn

1

我懷疑問題是,你從QWidget繼承兩次,一次通過QPushButton,一旦通過富。

從你說的這個問題的方式來看,我假設你想爲不同類型的小部件做這件事,因此不希望子類爲QPushButton,QLabel,QCheckBox等。如果這不是那麼你應該使用Nikos的答案。

如果不是,您最好的選擇可能是使用event filter

class MousePressFilter : public QObject { 
Q_OBJECT 
    public: 
     MousePressFilter(QObject *parent) : QObject(parent) { } 

    protected: 
     bool eventFilter(QObject *watched, QEvent *event) { 
      QWidget *widget = dynamic_cast<QWidget*>(watched); 
      widget->move(0,0); 
      return false; 
     } 
}; 

,然後在Foo類的構造函數:

class Foo { 
    Foo() { 
     installEventFilter(new MousePressFilter(this)); 
    } 
}; 
+0

我在項目中有許多不同的小部件,並且所有必須重寫此事件。我不認爲在每個特定的課程中重寫該事件是一個好主意(幹,你知道......)。我對事件過濾器一無所知,謝謝,我會了解它... – Kolyunya

+0

我已經實現了你的建議。當我從一些小部件和Foo中派生QWidget時,事件過濾器由於某種原因不起作用...任何想法... – Kolyunya

+0

對不起,我犯了一個錯誤,Foo不應該繼承任何東西。你的問題的一部分是你從兩個都是'QObject'的類繼承,這是不受支持的。 – Chris