Ich verstehe, wie man es benutzt, aber die Syntax stört mich. Was macht "Private Slots:"?
Ich habe noch nie etwas zwischen dem privaten Schlüsselwort und dem: in einer Klassendefinition gesehen. Gibt es hier ausgefallene C ++ - Magie?
Und hier ein Beispiel:
#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);
...
c++
qt
signals-slots
Justin
quelle
quelle
slots
definiert als#define slots
. Beim Kompilieren mit Qt MOC wird Code für den C ++ - Compiler generiert.Antworten:
Slots sind eine Qt-spezifische Erweiterung von C ++. Es wird erst kompiliert, nachdem der Code über den Präprozessor von Qt, den Meta-Object Compiler (moc), gesendet wurde. Dokumentation finden Sie unter http://doc.qt.io/qt-5/moc.html .
Bearbeiten: Wie Frank betont, wird moc nur zum Verknüpfen benötigt. Die zusätzlichen Schlüsselwörter werden mit dem Standardpräprozessor #definiert.
quelle
slots
Schlüsselwort notwendig? Ich habe versucht, ein paar winzige Qt-Programme zu kompilieren / zu verknüpfen, die Slots ohne dasslots
Schlüsselwort aufrufen, und sie haben sich gut entwickelt. Meine Experimente zeigen, dass:signals:
definitiv notwendig ist,slots
möglicherweise unnötig ist undemit
unnötig zu sein scheint, wie ich an anderer Stelle gelesen habe.slots
ist in Qt5 nicht erforderlich. Qt hat dieconnect()
Syntax aktualisiert , um das Verbinden eines Signals mit einer beliebigen Funktion, einschließlich Lambdas, zu ermöglichen. Aus diesem Grundslots
ist nicht notwendig. Dasslots
Schlüsselwort wirkt sich jedoch weiterhin auf die Art und Weise aus, wie ein Objekt erstelltQMetaObject
wird.moc
(auch bekannt als "Metaobjekt-Compiler") erkennt eine Methode nur dann als Slot, wenn sie sich imslots:
Abschnitt einer Klassendefinition befindet. Obwohl die Verbindung weiterhin funktioniert, wird die Methode in Introspection-Tools nicht angezeigt.Die Schlüsselwörter wie
public
,private
werden für Qt-Slots ignoriert. Alle Slots sind tatsächlich öffentlich und können verbunden werdenquelle
this
der uns bekannten Art und Weise.Wenn Sie Slots als privat deklarieren, können Sie sie nicht wie bei jeder anderen Methode aus einem Kontext referenzieren, in dem sie privat sind. Folglich können Sie die Adresse für private Slots nicht an übergeben
connect
.Wenn Sie das Signal als privat deklarieren, sagen Sie, dass nur diese Klasse es verwalten kann, Funktionselementzeiger jedoch keine Zugriffsbeschränkungen haben :
class A{ private: void e(){ } public: auto getPointer(){ return &A::e; } }; int main() { A a; auto P=a.getPointer(); (a.*P)(); }
Abgesehen davon gilt auch, was andere Antworten erwähnen:
- Sie können immer noch private Signale und Slots von außen mit Tricks verbinden
-
signals
undslots
sind leere Makros und brechen nicht den Sprachstandardquelle
slots
ein Makro hilfreich ist. Ich kann keine privaten Slot-Funktionszeigerconnect
ohne Tricks verbinden, oder?