Czy Qt obsługuje wirtualne, czyste automaty?

97

Mój projekt GUI w Qtma wiele klas „stron konfiguracji”, z których wszystkie dziedziczą bezpośrednio QWidget.

Niedawno zdałem sobie sprawę, że wszystkie te klasy mają dwa wspólne miejsca ( loadSettings()i saveSettings()).

W związku z tym mam dwa pytania:

  • Czy ma sens pisanie pośredniej, bazowej klasy abstrakcyjnej (nazwijmy ją BaseConfigurationPage) z tymi dwoma gniazdami jako czystymi metodami wirtualnymi? (Każda możliwa strona konfiguracji będzie zawsze miała te dwie metody, więc powiedziałbym „tak”)
  • Zanim dokonam poważnej zmiany w moim kodzie (jeśli muszę): czy Qt obsługuje wirtualne czyste sloty? Czy jest coś, o czym powinienem wiedzieć?

Oto przykład kodu opisujący wszystko:

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
źródło

Odpowiedzi:

164

Tak, podobnie jak zwykłe czyste metody wirtualne C ++. Kod wygenerowany przez MOC wywołuje czyste wirtualne gniazda, ale to jest w porządku, ponieważ i tak nie można utworzyć wystąpienia klasy bazowej ...

Ponownie, podobnie jak w przypadku zwykłych czystych metod wirtualnych języka C ++, nie można utworzyć wystąpienia klasy, dopóki metodom nie zostanie nadana implementacja.

Jedna rzecz: w podklasie tak naprawdę nie musisz oznaczać nadpisanych metod jako szczelin. Po pierwsze, są już zaimplementowane jako boksy w klasie bazowej. Po drugie, po prostu tworzysz więcej pracy dla MOC i kompilatora, ponieważ dodajesz (malutki) nieco więcej kodu. Banalne, ale nieważne.

Więc zrób to ...

ianmac45
źródło
1
Dziękuję za dokładną odpowiedź! Przetestuję to tak szybko, jak to możliwe;)
ereOn
3
Usunięcie specyfikacji gniazda z podklasy zapobiega wywołaniu przez moc podklasy ORAZ klasy bazowej! - Dzięki!
fmuecke
Przynajmniej w Qt 5, jeśli używasz obj-ptr, member-func-ptr, obj-ptr, member-func-ptrwersji connect, żaden z twoich slotów nie musi być deklarowany jako taki.
Kyle Strand
trzeba dodać naprawdę dziwne zachowanie: kiedy oznaczysz nadpisane metody jako sloty w nagłówku podklasy, sloty są wywoływane przez cały czas, nawet przy zerowych połączeniach z nimi. Domyśl!!!
bardao
2

Tylko gniazda w 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
źródło