2013-07-03 44 views
1

我有3個類繼承3個不同的類,它們都從QWidget基類繼承。 例如:爲類及其所有子類添加功能

  1. MyMainWindow : public QMainWindow : public QWidget
  2. MyPushButton : public QPushButton : public QWidget
  3. MyTextEdit : public QTextEdit : public QWidget

我將有更多的類像這樣的最終。 現在我想要做的是爲我的所有課程添加一個常用方法;這意味着它應該被添加到QWidget基類,但我不能編輯它(我寧可不更改一種方法的Qt源代碼)。

這種行爲可能嗎? 我已經使用接口,像這樣嘗試:

class MyTextEdit : public QTextEdit, IMyMethodContainer { ... }; 

但問題是,我需要訪問QObject::connect(sender, signal, this, slot);IMyMethodContainer,並通過this我試圖訪問MyTextEdit,而不是IMyMethodContainer,這是不QWidget的子類。

回答

2

CRTP可能會有幫助。

template<typename Derived, typename Base> 
struct InjectMethod: Base { 
    static_assert(std::is_base_of< InjectMethod<Derived,Base>, Derived >::value, "CRTP violation"); 
    Derived* self() { return static_cast<Derived*>(this); } 
    Derived const* self() const { return static_cast<Derived*>(this); } 
    void my_method() { 
    // use self() inside this method to access your Derived state 
    } 
}; 

然後:

class MyTextEdit: InjectMethod< MyTextEdit, QTextEdit > { 
}; 
class MyPushButton: InjectMethod< MyPushButton, QPushButton > { 
}; 

InjectMethod< MyTextEdit, QTextEdit >你有機會獲得一個self()指針具有內部MyTextEdit訪問所有的東西,裏面InjectMethod< MyPushButton, QPushButton >相同。

如果您只使用QWidget功能,則可能不需要Derived部分 - 可能只有一個模板參數(您的基準)就足夠了。

+0

謝謝,lifesavior :)是的,我不會使用「衍生」部分,但保留在那裏,其他人可能需要它^^ –

0

在Java中,您可以「擴展」QWidget並在其中添加自定義方法。

Class MyQWidgetExtension extends QWidget { ... } 

你的其他類(QMainWindow的,QpushButton,的QTextEdit)剛剛擴展( 「繼承」)從。 C++有類似嗎?

Class MyQWidgetExtension : public QWidget { ... } 
+0

問題是'QTextObject',他也不能控制'QWidget'和@Markus的類之間。 – Yakk