2015-05-02 21 views
6

ten sposób deklaracje w wyglądzie klasy bazowej:Połącz z chronionym szczeliny w klasie pochodnej

protected: 
    void indexAll(); 
    void cleanAll(); 

w klasie pochodnej, co następuje nie kompiluje:

indexAll(); // OK 
connect(&_timer, &QTimer::timeout, this, &FileIndex::indexAll); // ERROR 
connect(&_timer, SIGNAL(timeout()), this, SLOT(indexAll())); // OK 

Chciałbym użyć pierwszy wariant connect, ponieważ wykonuje pewne kontrole czasu kompilacji. Dlaczego to zwraca błąd:

error: 'void Files::FileIndex::indexAll()' is protected 
void FileIndex::indexAll() 
    ^
[...].cpp:246:58: error: within this context 
    connect(&_timer, &QTimer::timeout, this, &FileIndex::indexAll); 
                 ^
+0

To znaczy, że preferuje się pierwszy ... pierwszy przychodzi z kontroli skompilować. – Greenflow

+0

OK tak: D Pierwszy "połącz", ale drugi wiersz. – ManuelSchneid3r

Odpowiedz

7

"Stara" składnia stylu działa, ponieważ emisja sygnału przebiega przez qt_static_metacall(..), która jest członkiem FileIndex i dlatego ma chroniony dostęp.

Składnia "nowego" stylu działa, ale for this reason nie pozwoli ci pobrać adresu bezpośrednio z metody klasy nadrzędnej. Będzie on jednak wziąć dziedziczone adres indexAll(), więc wystarczy zmienić kod do:

connect(&_timer, &QTimer::timeout, this, &Derived::indexAll); 
0

Pierwszy z nich jest regulowany przez normalne reguły dostępu C++. Sygnał czasu QTimer :: timeout wywołuje FileIndex :: indexAll bezpośrednio na podanym wskaźniku funkcji. Oczywiście jest to możliwe tylko wtedy, gdy wskaźnik tej funkcji jest publiczny (pomijając możliwe rozwiązania przyjacielskie). Jeśli używasz wskaźników funkcji, nie musisz nawet oznaczyć funkcji jako SLOT w pliku nagłówkowym.

Drugi to moc magia. Połączenia przez system metaobiektowy. Nigdy nie zagłębiałem się w ten temat głębiej ... po prostu zadziałało. :-)

Ok, nie najlepsze wytłumaczenie. Jeśli chcesz uzyskać więcej informacji:

http://woboq.com/blog/new-signals-slots-syntax-in-qt5.html

http://woboq.com/blog/how-qt-signals-slots-work.html

http://woboq.com/blog/how-qt-signals-slots-work-part2-qt5.html

Dobry czyta, ale ... tylko interesujące jeśli są zainteresowani w głębszych wyrobiskach Qt. IMHO jest konieczna tylko, jeśli chcesz sam rozwinąć Qt.