O Qt suporta slots virtuais puros?

97

Meu projeto de GUI Qttem muitas classes de "páginas de configuração" das quais todas herdam diretamente QWidget.

Recentemente, percebi que todas essas classes compartilham 2 slots comuns ( loadSettings()e saveSettings()).

A respeito disso, tenho duas perguntas:

  • Faz sentido escrever uma classe abstrata de base intermediária (vamos nomeá-la BaseConfigurationPage) com esses dois slots como métodos puros virtuais? (Cada página de configuração possível sempre terá esses dois métodos, então eu diria "sim")
  • Antes de fazer uma grande mudança no meu código (se for necessário): o Qt suporta slots virtuais puros? Há algo que eu deva estar ciente?

Aqui está um exemplo de código que descreve tudo:

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
fonte

Respostas:

164

Sim, assim como os métodos virtuais puros normais do c ++. O código gerado pelo MOC chama os slots virtuais puros, mas está tudo bem, pois a classe base não pode ser instanciada de qualquer maneira ...

Novamente, assim como os métodos virtuais puros normais do C ++, a classe não pode ser instanciada até que os métodos recebam uma implementação.

Uma coisa: na subclasse, você realmente não precisa marcar os métodos sobrescritos como slots. Primeiro, eles já estão implementados como slots na classe base. Em segundo lugar, você está apenas criando mais trabalho para o MOC e o compilador, pois está adicionando um (minúsculo) código a mais. Trivial, mas tanto faz.

Então, vá em frente ..

ianmac45
fonte
1
Obrigado pela sua resposta precisa! Vou testar isso o mais rápido possível;)
ereOn
3
Remover a especificação de slot da subclasse evita que o moc chame a subclasse E a classe base! - Obrigado cara!
fmuecke
No Qt 5, pelo menos, se você estiver usando a obj-ptr, member-func-ptr, obj-ptr, member-func-ptrversão do connect, nenhum de seus slots precisa ser declarado como tal.
Kyle Strand
tem que adicionar um comportamento realmente estranho: quando você marca os métodos sobrescritos como slots no cabeçalho da subclasse, os slots são chamados o tempo todo, mesmo com 0 conexões para eles. Vai saber!!!
bardão
2

Apenas slots na 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
fonte