Поддерживает ли Qt виртуальные чистые слоты?

В моем проекте GUI в Qt есть много классов "страниц конфигурации", которые все наследуют непосредственно из QWidget.

Недавно я понял, что все эти классы имеют 2 общедоступных слота (loadSettings() и saveSettings()).

В связи с этим у меня есть два вопроса:

  • Имеет ли смысл писать промежуточный базовый абстрактный класс (позволяет назвать его BaseConfigurationPage) этими двумя слотами как виртуальные чистые методы? (Каждая возможная страница конфигурации всегда будет иметь эти два метода, поэтому я бы сказал "да" )
  • Прежде чем я начну сильно меняться в своем коде (если нужно): 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();
};

Ответ 1

Да, точно так же, как обычные виртуальные методы С++. Код, созданный MOC, вызывает чистые виртуальные слоты, но это нормально, так как базовый класс не может быть создан в любом случае...

Опять же, как обычные обычные виртуальные методы С++, класс не может быть создан до тех пор, пока методы не получат реализацию.

Одна вещь: в подклассе вам вообще не нужно отмечать переопределенные методы как слоты. Во-первых, они уже реализованы как слоты в базовом классе. Во-вторых, вы просто создаете больше работы для MOC и компилятора, так как вы добавляете (крошечный) бит больше кода. Тривиально, но что угодно.

Итак, пойдите для этого.

Ответ 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();
};