Rozumiem, jak go używać, ale przeszkadza mi jego składnia. Co robi "prywatne automaty:"?
Nigdy wcześniej nie widziałem czegoś pomiędzy prywatnym słowem kluczowym a: w definicji klasy. Czy dzieje się tutaj jakaś fantazyjna magia C ++?
A tutaj przykład:
#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
źródło
źródło
slots
jest definiowane jako#define slots
. Podczas kompilacji przy użyciu Qt MOC generuje kod dla kompilatora C ++.Odpowiedzi:
Sloty są rozszerzeniem C ++ specyficznym dla Qt. Kompiluje się dopiero po wysłaniu kodu przez preprocesor Qt, Meta-Object Compiler (moc). Zobacz http://doc.qt.io/qt-5/moc.html dokumentację .
Edycja: jak podkreśla Frank, moc jest wymagana tylko do łączenia. Dodatkowe słowa kluczowe są #definowane za pomocą standardowego preprocesora.
źródło
slots
słowo kluczowe jest potrzebne? Próbowałem skompilować / połączyć kilka małych programów Qt, które wywołują sloty bezslots
słowa kluczowego i zbudowały się dobrze. Moje eksperymenty pokazują, że:signals:
jest zdecydowanie konieczne,slots
może być niepotrzebne iemit
wydaje się niepotrzebne, jak czytałem gdzie indziej.slots
nie jest konieczne w Qt5. Qt zaktualizowałoconnect()
składnię, aby umożliwić podłączenie sygnału do dowolnej funkcji, w tym lambd. Z tego powoduslots
nie jest konieczne. Jednakslots
słowo kluczowe nadal wpływa na sposóbQMetaObject
budowania obiektu.moc
(inaczej „kompilator metaobiektów”) nie rozpozna metody jako boksu, chyba że znajduje się ona wslots:
sekcji definicji klasy. Tak więc, chociaż połączenie będzie nadal działać, metoda nie pojawi się w narzędziach do introspekcji.Słowa kluczowe, takie jak
public
,private
są ignorowane w przypadku gniazd Qt. Wszystkie gniazda są w rzeczywistości publiczne i można je podłączyćźródło
this
znanym nam sposobem.Zadeklarowanie gniazd jako prywatnych oznacza, że nie będziesz w stanie odwoływać się do nich z kontekstu, w którym są prywatne, jak w przypadku każdej innej metody. W konsekwencji nie będziesz mógł przekazywać adresów prywatnych slotów do
connect
.Jeśli deklarujesz sygnał jako prywatny, mówisz, że tylko ta klasa może nim zarządzać, ale wskaźniki składowe funkcji nie mają ograniczeń dostępu :
class A{ private: void e(){ } public: auto getPointer(){ return &A::e; } }; int main() { A a; auto P=a.getPointer(); (a.*P)(); }
Poza tym ważne są również inne odpowiedzi:
- nadal możesz łączyć prywatne sygnały i sloty z zewnątrz za pomocą sztuczek
-
signals
islots
są to puste makra i nie łamią standardu językowegoźródło
slots
jest to makro , jest pomocne. Nie mogę podłączyć prywatnych wskaźników funkcji slotówconnect
bez sztuczek, prawda?