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


97

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

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

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

  • BaseConfigurationPageこれらの2つのスロットを仮想純粋メソッドとして使用して、中間の基本抽象クラス(名前を付けます)を記述することには意味がありますか?(可能なすべての構成ページには常にこれらの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();
};

回答:


163

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

この場合も、通常のc ++純粋仮想メソッドと同様に、メソッドに実装が提供されるまでクラスをインスタンス化できません。

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

だから、それのために行きます。


1
あなたの正確な答えをありがとう!私はこれをできるだけ早くテストします;)
ereOn

3
サブクラスからスロット指定を削除すると、mocはサブクラスと基本クラスを呼び出せなくなります。- ありがとう!
fmuecke 2012年

Qtの5では、少なくとも、あなたが使用している場合obj-ptr, member-func-ptr, obj-ptr, member-func-ptrのバージョンconnectどれもあなたのスロットをする必要が宣言など。
カイルストランド

本当に奇妙な動作を追加する必要があります。オーバーライドされたメソッドをサブクラスのヘッダーのスロットとしてマークすると、それらへの接続が0であっても、スロットは常に呼び出されます。ゴーゴー!!!
bardao 2018

2

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();
};
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.