Qt supporta gli slot puri virtuali?


97

Il mio progetto GUI in Qtha molte classi di "pagine di configurazione" da cui ereditano tutte direttamente QWidget.

Recentemente, mi sono reso conto che tutte queste classi condividono 2 slot comuni ( loadSettings()e saveSettings()).

A questo proposito, ho due domande:

  • Ha senso scrivere una classe astratta di base intermedia (chiamiamola BaseConfigurationPage) con questi due slot come metodi puri virtuali? (Ogni possibile pagina di configurazione avrà sempre questi due metodi, quindi direi "sì")
  • Prima di apportare modifiche sostanziali al mio codice (se necessario): Qt supporta gli slot puri virtuali? C'è qualcosa di cui dovrei essere a conoscenza?

Ecco un esempio di codice che descrive tutto:

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

Risposte:


164

Sì, proprio come i normali metodi virtuali puri in c ++. Il codice generato da MOC chiama gli slot virtuali puri, ma va bene poiché la classe base non può essere istanziata comunque ...

Di nuovo, proprio come i normali metodi virtuali c ++ puri, la classe non può essere istanziata fino a quando non viene fornita un'implementazione ai metodi.

Una cosa: nella sottoclasse, in realtà non è necessario contrassegnare i metodi sostituiti come slot. Innanzitutto, sono già implementati come slot nella classe base. In secondo luogo, stai solo creando più lavoro per il MOC e il compilatore poiché stai aggiungendo un (minuscolo) bit in più di codice. Banale, ma qualunque cosa.

Quindi, fallo ..


1
Grazie per la tua precisa risposta! Lo
proverò il

3
La rimozione della specifica dello slot dalla sottoclasse impedisce a moc di chiamare la sottoclasse E la classe base! - Grazie uomo!
fmuecke

In Qt 5, almeno, se stai usando la obj-ptr, member-func-ptr, obj-ptr, member-func-ptrversione di connect, nessuno dei tuoi slot deve essere dichiarato come tale.
Kyle Strand

bisogna aggiungere un comportamento davvero strano: quando si contrassegnano i metodi sovrascritti come slot nell'intestazione della sottoclasse, gli slot vengono chiamati sempre anche con 0 connessioni ad essi. Vai a capire!!!
bardao

2

Solo slot in 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();
};
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.