我有3个类继承自3个不同的类,这些类都继承自QWidget
基类。
例如:
MyMainWindow : public QMainWindow : public QWidget
MyPushButton : public QPushButton : public QWidget
MyTextEdit : public QTextEdit : public QWidget
我最终会有更多这样的课程。
我现在要做的是为我的所有课程添加一个通用的方法;这意味着它应该被添加到QWidget
基类中,但是我无法编辑它(我不想改变一种方法的Qt源代码)。
这种行为可能吗? 我已经尝试过使用这样的界面:
class MyTextEdit : public QTextEdit, IMyMethodContainer { ... };
但问题是,我需要访问QObject::connect(sender, signal, this, slot);
中的IMyMethodContainer
,this
我要尝试访问MyTextEdit
,而不是IMyMethodContainer
1}},它不是QWidget
的子类。
答案 0 :(得分: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 >
内的所有内容。
您可能不需要Derived
部分 - 如果您只使用QWidget
功能,则可能只有一个模板参数(您的基础)就足够了。
答案 1 :(得分:0)
在Java中,您可以“扩展”QWidget并在那里添加自定义方法。
Class MyQWidgetExtension extends QWidget { ... }
你的其他类(QMainWindow,QpushButton,QtextEdit)只是扩展(“继承”)。 C ++有类似的东西吗?
Class MyQWidgetExtension : public QWidget { ... }