web-dev-qa-db-fra.com

Qt prend-il en charge les emplacements virtuels purs?

Mon projet GUI dans Qt a beaucoup de classes de "pages de configuration" qui héritent toutes directement de QWidget.

Récemment, j'ai réalisé que toutes ces classes partagent 2 emplacements communs (loadSettings() et saveSettings()).

À ce sujet, j'ai deux questions:

  • Est-il judicieux d'écrire une classe abstraite de base intermédiaire (nommons-la BaseConfigurationPage) avec ces deux emplacements en tant que méthodes virtuelles pures? (Toutes les pages de configuration possibles toujours ont ces deux méthodes, donc je dirais "oui")
  • Avant de faire le gros changement dans mon code (si je dois le faire): Qt prend-il en charge les slots virtuels purs? Y a-t-il quelque chose que je devrais savoir?

Voici un exemple de code décrivant tout:

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

Oui, tout comme les méthodes virtuelles pures c ++ normales. Le code généré par MOC appelle les emplacements virtuels purs, mais ça va puisque la classe de base ne peut pas être instanciée de toute façon ...

Encore une fois, tout comme les méthodes virtuelles pures c ++ normales, la classe ne peut pas être instanciée jusqu'à ce que les méthodes reçoivent une implémentation.

Une chose: dans la sous-classe, vous n'avez en fait pas besoin de marquer les méthodes remplacées comme des emplacements. Tout d'abord, ils sont déjà implémentés en tant que slots dans la classe de base. Deuxièmement, vous créez simplement plus de travail pour le MOC et le compilateur puisque vous ajoutez un (petit) peu plus de code. Trivial, mais peu importe.

Alors, allez-y ..

154
ianmac45

Seuls les emplacements dans la 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();
};
1
lygstate