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);in IMyMethodContainer,并且this我试图访问MyTextEdit,而不是IMyMethodContainer,它不是QWidget.

4

2 回答 2

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

于 2013-07-03T17:54:37.380 回答
0

在 Java 中,您可以“扩展” QWidget 并在那里添加您的自定义方法。

Class MyQWidgetExtension extends QWidget { ... }

您的其他类(QMainWindow、QpushButton、QtextEdit)只是从中扩展(“继承”)。C++有类似的吗?

Class MyQWidgetExtension : public QWidget { ... }
于 2013-07-03T17:40:21.110 回答