1. ホーム
  2. c++

[解決済み] Qt は仮想ピュアスロットをサポートしていますか?

2022-11-07 07:57:31

質問

私のGUIプロジェクトは Qt には多くの設定ページがあり、それらはすべて QWidget .

最近、これらのクラスはすべて 2 つのコモンズ・スロットを共有していることに気づきました ( loadSettings()saveSettings() ).

これに関して、2つ質問があります。

  • 中間的なベースとなる抽象クラス (仮に BaseConfigurationPage と名付けます) を書くことは意味があるのでしょうか?(すべての可能な設定ページ は常に はこれら2つのメソッドを持つので、私は"yes"と言うでしょう)
  • 私のコードに大きな変更を加える前に(必要であれば)、Qt は仮想ピュアスロットをサポートしていますか?私が注意しなければならないことはありますか。

以下は、すべてを説明するコード例です。

class BaseConfigurationPage : public QWidget
{
  // Some constructor and other methods, irrelevant here.

  public slots:

    virtual void loadSettings() = 0;
    virtual void saveSettings() = 0;
};

class GeneralConfigurationPage : public BaseConfigurationPage
{
  // Some constructor and other methods, irrelevant here.

  public slots:

    void loadSettings();
    void saveSettings();
};

どのように解決するのですか?

はい、通常の c++ 純粋仮想メソッドと同じです。MOC によって生成されたコードは純粋仮想スロットを呼び出しますが、どのみちベース クラスはインスタンス化できないので大丈夫です...。

繰り返しますが、通常の c++ 純粋仮想メソッドと同様に、メソッドに実装が与えられるまで、クラスはインスタンス化できません。

ひとつだけ、サブクラスでは、オーバーライドされたメソッドをスロットとしてマークする必要はありません。第一に、それらはベースクラスですでにスロットとして実装されています。第二に、MOCとコンパイラの仕事を増やすだけで、(ほんの)少しのコードを追加していることになります。些細なことですが、とにかく。

だから、それのために行く...