2010-06-08 2 views
81

Мой проект GUI в Qt имеет множество классов «страниц конфигурации», которые все наследуют напрямую от QWidget.Поддерживает ли Qt виртуальные чистые слоты?

Недавно я понял, что все эти классы имеют 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(); 
}; 

ответ

137

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

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

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

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

+0

Спасибо за ваш точный ответ! Я проверю это как можно скорее;) – ereOn

+14

+1 для вашей «Одной вещи». Хорошая вещь, чтобы знать. –

+0

Проверено: действует как очарование. Еще раз спасибо;) – ereOn

-1

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