c++ - custom - signals and slots qt
¿Qt admite ranuras virtuales puras? (2)
Sí, al igual que los métodos virtuales puros de c ++. El código generado por MOC llama a las máquinas tragamonedas virtuales puras, pero está bien, ya que la clase base no puede ser instanciada de todos modos ...
Nuevamente, al igual que los métodos virtuales puros regulares de c ++, la clase no se puede instanciar hasta que los métodos reciban una implementación.
Una cosa: en la subclase, no es necesario marcar los métodos anulados como ranuras. Primero, ya están implementados como slots en la clase base. En segundo lugar, 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.
Entonces, ve por eso ...
Mi proyecto de GUI en Qt
tiene muchas clases de "páginas de configuración" que todas heredan directamente de QWidget
.
Recientemente, me di cuenta de que todas estas clases comparten 2 espacios comunes ( loadSettings()
y saveSettings()
).
En relación con esto, tengo dos preguntas:
- ¿Tiene sentido escribir una clase abstracta base intermedia (
BaseConfigurationPage
) con estos dos espacios como métodos virtuales puros? (Cada página de configuración posible siempre tendrá estos dos métodos, entonces yo diría "sí") - Antes de hacer el gran cambio en mi código (si es necesario): ¿Qt admite ranuras virtuales puras? ¿Hay algo que deba saber?
Aquí hay 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();
};
Solo espacios en la página BaseConfiguration
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();
};