wake-up-neo.com

Unterstützt Qt virtuelle reine Slots?

Mein GUI-Projekt in Qt hat viele "Konfigurationsseiten" -Klassen, die alle direkt von QWidget erben.

Vor kurzem habe ich festgestellt, dass alle diese Klassen zwei gemeinsame Slots haben (loadSettings() und saveSettings()).

Dazu habe ich zwei Fragen:

  • Ist es sinnvoll, eine mittlere abstrakte Basisklasse (nennen wir sie BaseConfigurationPage) mit diesen beiden Slots als virtuelle reine Methoden zu schreiben? (Jede mögliche Konfigurationsseite wird immer diese beiden Methoden haben, also würde ich "ja" sagen)
  • Bevor ich meinen Code stark ändere (wenn ich muss): Unterstützt Qt virtuelle reine Slots? Was sollte ich beachten?

Hier ist ein Codebeispiel, das alles beschreibt:

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

Ja, genau wie normale rein virtuelle C++ - Methoden. Der von MOC generierte Code ruft die rein virtuellen Slots auf, aber das ist in Ordnung, da die Basisklasse sowieso nicht instanziiert werden kann ...

Ebenso wie bei normalen rein virtuellen c ++ - Methoden kann die Klasse erst dann instanziiert werden, wenn die Methoden implementiert wurden.

Eine Sache: In der Unterklasse müssen Sie die überschriebenen Methoden eigentlich nicht als Slots markieren. Erstens sind sie bereits als Slots in der Basisklasse implementiert. Zweitens erstellen Sie nur mehr Arbeit für den MOC und den Compiler, da Sie ein (kleines) bisschen mehr Code hinzufügen. Trivial, aber was auch immer.

Also los ..

154
ianmac45

Nur Steckplätze in der 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