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


моя графического интерфейса проекта в 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();
};
2 85

2 ответа:

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

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

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

Итак, вперед..

только слоты в 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();
};