Поддерживает ли 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 ответа:
да, как и обычные 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(); };