Поддерживает ли Qt виртуальные чистые слоты? - PullRequest
89 голосов
/ 08 июня 2010

Мой проект с графическим интерфейсом в 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 ]

150 голосов
/ 08 июня 2010

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

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

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

Итак, дерзайте ...

0 голосов
/ 22 ноября 2013

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