¿Qt admite ranuras puras virtuales?


97

Mi proyecto GUI en Qttiene muchas clases de "páginas de configuración" que heredan directamente QWidget.

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

Respecto a esto, tengo dos preguntas:

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

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

Respuestas:


164

Sí, al igual que los métodos virtuales puros normales de C ++. El código generado por MOC llama a las ranuras virtuales puras, pero eso está bien, ya que la clase base no se puede instanciar de todos modos ...

Nuevamente, al igual que los métodos virtuales puros normales de C ++, la clase no puede ser instanciada hasta que los métodos tengan una implementación.

Una cosa: en la subclase, en realidad no es necesario marcar los métodos anulados como ranuras. Primero, ya están implementados como ranuras en la clase base. En segundo lugar, solo está creando más trabajo para el MOC y el compilador, ya que está agregando un poco más de código. Trivial, pero lo que sea.

Así que adelante ...


1
¡Gracias por tu respuesta precisa! Lo
probaré lo

3
¡Eliminar la especificación de ranura de la subclase evita que moc llame a la subclase Y a la clase base! - ¡Gracias hombre!
fmuecke

En Qt 5, al menos, si está utilizando la obj-ptr, member-func-ptr, obj-ptr, member-func-ptrversión de connect, ninguna de sus ranuras debe declararse como tal.
Kyle Strand

Tengo que agregar un comportamiento realmente extraño: cuando marca los métodos anulados como ranuras en el encabezado de la subclase, las ranuras se llaman todo el tiempo incluso con 0 conexiones a ellas. ¡¡¡Imagínate!!!
bardao

2

Solo ranuras en 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();
};
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.