Qt prend-il en charge les slots virtuels purs?

97

Mon projet GUI dans Qta 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 slots communs ( loadSettings()et saveSettings()).

À ce sujet, j'ai deux questions:

  • Est-il judicieux d'écrire une classe abstraite de base intermédiaire (appelons-la BaseConfigurationPage) avec ces deux slots comme méthodes pures virtuelles? (Chaque page de configuration possible aura toujours 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 dont je devrais être conscient?

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

Réponses:

164

Oui, tout comme les méthodes virtuelles pures C ++ classiques. Le code généré par MOC appelle les slots virtuels purs, mais ce n'est pas grave car 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 ++ classiques, la classe ne peut pas être instanciée tant que les méthodes n'ont pas reçu 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 slots. Premièrement, 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 (tout petit) peu plus de code. Trivial, mais peu importe.

Alors, allez-y.

ianmac45
la source
1
Merci pour votre réponse précise! Je vais tester cela dès que possible;)
ereOn
3
La suppression de la spécification de slot de la sous-classe empêche moc d'appeler la sous-classe ET la classe de base! - Merci mec!
fmuecke
Dans Qt 5, au moins, si vous utilisez la obj-ptr, member-func-ptr, obj-ptr, member-func-ptrversion de connect, aucun de vos emplacements n'a besoin d'être déclaré comme tel.
Kyle Strand
devez ajouter un comportement vraiment étrange: lorsque vous marquez les méthodes surchargées comme des emplacements dans l'en-tête de la sous-classe, les emplacements sont appelés tout le temps même avec 0 connexion. Allez comprendre!!!
bardao
2

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