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

97

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

Ответы:

164

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

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

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

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

ianmac45
источник
1
Спасибо за точный ответ! Я протестирую это как можно скорее;)
ereOn
3
Удаление спецификации слота из подкласса не позволяет moc вызывать подкласс И базовый класс! - Спасибо чувак!
fmuecke
По крайней мере, в Qt 5, если вы используете obj-ptr, member-func-ptr, obj-ptr, member-func-ptrверсию connect, ни один из ваших слотов не должен быть объявлен как таковой.
Kyle Strand
нужно добавить действительно странное поведение: когда вы помечаете переопределенные методы как слоты в заголовке подкласса, слоты вызываются все время, даже если к ним подключено 0. Иди разберись !!!
bardao
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();
};
Lygstate
источник