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);
...
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.
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
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