web-dev-qa-db-fra.com

Qt "slots privés:" qu'est-ce que c'est?

Je comprends comment l'utiliser, mais sa syntaxe me dérange. Que fait "créneaux privés"?

Je n'ai jamais vu quelque chose entre le mot-clé privé et le: dans une définition de classe auparavant. Y a-t-il une magie C++ sophistiquée qui se passe ici?

Et exemple ici:

 #include <QObject>

 class Counter : public QObject
 {
     Q_OBJECT

 public:
     Counter() { m_value = 0; }

     int value() const { return m_value; }

 public slots:
     void setValue(int value);

 ...
69
Justin

Les slots sont une extension spécifique à Qt de C++. Il ne se compile qu'après l'envoi du code via le préprocesseur de Qt, le Meta-Object Compiler (moc). Voir http://doc.qt.io/qt-5/moc.html pour la documentation.

Edit: Comme le souligne Frank, moc n'est nécessaire que pour la liaison. Les mots-clés supplémentaires sont #defined loin avec le préprocesseur standard.

50
Russell Davis

Les mots clés tels que public, private sont ignorés pour les emplacements Qt. Tous les emplacements sont en fait publics et peuvent être connectés

16
Andrew

Déclarer des emplacements comme privés signifie que vous ne pourrez pas les référencer à partir du contexte dans lequel ils sont privés, comme toute autre méthode. Par conséquent, vous ne pourrez pas transmettre l'adresse des emplacements privés à connect.

Si vous déclarez le signal comme privé, vous dites que seule cette classe peut le gérer mais les pointeurs membres de la fonction n'ont pas de restrictions d'accès :

class A{
    private:
    void e(){

    }
    public:
    auto getPointer(){
        return &A::e;   
    }
};

int main()
{
    A a;
    auto P=a.getPointer();
    (a.*P)();
}

En dehors de cela, les autres réponses mentionnées sont également valables:
- vous pouvez toujours connecter des signaux et des emplacements privés de l'extérieur avec des astuces
- signals et slots sont des macros vides et ne respectent pas la norme de langue

3
Euri Pinhollow