web-dev-qa-db-ja.com

Qtは仮想純粋スロットをサポートしていますか?

QtのGUIプロジェクトには、QWidgetから直接継承する多くの「構成ページ」クラスがあります。

最近、これらすべてのクラスが2つの共通スロット(loadSettings()saveSettings())を共有していることに気付きました。

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

  • これらの2つのスロットを仮想純粋メソッドとして使用して、中間の基本抽象クラス(BaseConfigurationPageと名付けます)を記述するのは理にかなっていますか? (可能なすべての構成ページ常にこれら2つの方法があるため、「はい」と言います)
  • コードを大幅に変更する前に(必要な場合)、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();
};
92
ereOn

はい、通常のC++純粋仮想メソッドと同じです。 MOCによって生成されたコードは純粋な仮想スロットを呼び出しますが、基本クラスはとにかくインスタンス化できないため、それは問題ありません...

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

1つ:サブクラスでは、オーバーライドされたメソッドを実際にスロットとしてマークする必要はありません。まず、これらは基本クラスのスロットとして既に実装されています。第二に、あなたは(ごく)もう少しコードを追加しているので、MOCとコンパイラのためにより多くの作業を作成しているだけです。些細ですが、何でも。

どうぞ。

154
ianmac45

BaseConfigurationPageのスロットのみ

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.

    void loadSettings();
    void saveSettings();
};
1
lygstate