2010-06-08 11 views
81

Mi proyecto de GUI en Qt tiene muchas clases de "páginas de configuración" que todas heredan directamente de QWidget.¿Qt admite ranuras virtuales puras?

Recientemente, me di cuenta de que todas estas clases comparten 2 espacios comunes (loadSettings() y saveSettings()).

En cuanto a esto, tengo dos preguntas:

  • ¿Tiene sentido escribir una clase abstracta base intermedia (deja el nombre que BaseConfigurationPage) con estas dos ranuras como métodos puros virtuales? (Cada página de configuración posible siempre tendrá tiene estos dos métodos, entonces yo diría "sí")
  • Antes de hacer el cambio pesado en mi código (si es necesario): ¿Qt admite ranuras virtuales puras? ¿Hay algo que deba saber?

Aquí es un ejemplo de código que describe todo:

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(); 
}; 

Respuesta

137

Sí, al igual que C++ regular de métodos virtuales puros. El código generado por MOC llama a las máquinas tragamonedas virtuales puras, pero está bien, ya que la clase base no puede crearse una instancia de todos modos ...

De nuevo, al igual que los métodos virtuales puros de C++, la clase no se puede instanciar hasta que los métodos se les da una implementación.

Una cosa: en la subclase, realmente no necesita marcar los métodos anulados como ranuras. Uno, ya están implementados como máquinas tragamonedas en la clase base. Dos, solo está creando más trabajo para el MOC y el compilador, ya que está agregando un código (un poquito) más. Trivial, pero lo que sea.

Por lo tanto, vaya para él ..

+0

Gracias por su respuesta precisa! Voy a probar esto lo antes posible;) – ereOn

+14

+1 para su "Una cosa". Qué bueno saber. –

+0

comprobado: funciona como un encanto. Gracias de nuevo;) – ereOn

-1

Sólo las ranuras en el 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(); 
}; 
Cuestiones relacionadas