1

QWidget基本クラスからすべて継承する3つの異なるクラスから継承する3つのクラスがあります。例えば:

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

そして、最終的には、このようなクラスがさらに増えるでしょう。今やりたいことは、すべてのクラスに共通のメソッドを追加することです。これは、基本クラスに追加する必要があることを意味しますがQWidget、編集することはできません (1 つのメソッドの Qt ソース コードを変更したくありません)。

この種の動作は可能ですか?私はすでに次のようなインターフェースを使用してみました:

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

しかし、問題は、 にアクセスする必要がQObject::connect(sender, signal, this, slot);あり、 のサブクラスではないではなくにアクセスしようとしていることIMyMethodContainerです。thisMyTextEditIMyMethodContainerQWidget

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()MyTextEditInjectMethod< MyPushButton, QPushButton >

この部分は必要ないかもしれません。機能Derivedだけを使用する場合は、テンプレート パラメータ (ベース) が 1 つあれば十分でしょう。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 に答える