Unterstützt Qt virtuelle reine Slots?

97

Mein GUI-Projekt in Qthat viele "Konfigurationsseiten" -Klassen, von denen alle direkt erben QWidget.

Kürzlich wurde mir klar, dass alle diese Klassen zwei gemeinsame Slots ( loadSettings()und saveSettings()) haben.

Diesbezüglich habe ich zwei Fragen:

  • Ist es sinnvoll, eine abstrakte Basisklasse (nennen wir es BaseConfigurationPage) mit diesen beiden Slots als virtuelle reine Methoden zu schreiben ? (Jede mögliche Konfigurationsseite hat immer diese beiden Methoden, daher würde ich "Ja" sagen.)
  • Bevor ich die umfangreichen Änderungen an meinem Code vornehme (falls erforderlich): Unterstützt Qt virtuelle reine Slots? Gibt es etwas, das ich beachten sollte?

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

Antworten:

163

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

Genau wie bei normalen reinen virtuellen C ++ - Methoden kann die Klasse erst instanziiert werden, wenn die Methoden eine Implementierung erhalten.

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

Also, mach es ..

ianmac45
quelle
1
Vielen Dank für Ihre genaue Antwort! Ich werde das so schnell wie möglich testen;)
am
3
Das Entfernen der Slot-Spezifikation aus der Unterklasse verhindert, dass moc die Unterklasse UND die Basisklasse aufruft! - Danke, Mann!
Fmuecke
Zumindest in Qt 5 muss, wenn Sie die obj-ptr, member-func-ptr, obj-ptr, member-func-ptrVersion von verwenden connect, keiner Ihrer Slots als solcher deklariert werden.
Kyle Strand
Sie müssen ein wirklich seltsames Verhalten hinzufügen: Wenn Sie die Überschreibungsmethoden als Slots in der Kopfzeile der Unterklasse markieren, werden Slots auch bei 0 Verbindungen zu ihnen ständig aufgerufen. Stelle dir das vor!!!
Bardao
2

Nur Slots 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();
};
lygstate
quelle