2015-05-02 20 views
6

In questo modo le dichiarazioni del sguardo classe base:Connetti a fessura protetta in classe derivata

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

Nella classe derivata la seguente non viene compilato:

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

Vorrei utilizzare la prima variante di connect, poiché esegue alcuni controlli del tempo di compilazione. Perché restituisce l'errore:

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

Vuoi dire che si preferisce il primo ... il primo è dotato di controlli di compilazione. – Greenflow

+0

Ok si: D Il primo "collega", ma la seconda riga. – ManuelSchneid3r

risposta

7

La sintassi di stile "vecchio" funziona perché l'emissione del segnale attraversa qt_static_metacall(..) che è un membro di FileIndex e quindi ha accesso protetto.

La sintassi del 'nuovo' stile funziona, ma for this reason non consente di prendere l'indirizzo direttamente dal metodo della classe genitore. Sarà tuttavia prendere l'indirizzo 'ereditato' di indexAll(), quindi basta modificare il codice a:

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

Il primo è regolato dalle normali regole di accessibilità C++. Il segnale QTimer :: timeout chiama direttamente FileIndex :: indexAll sul puntatore funzione fornito. Naturalmente, questo è possibile solo quando questo puntatore di funzione è pubblico (ignorando possibili soluzioni di amicizia). Se si usano i puntatori di funzioni, non è nemmeno necessario contrassegnare la funzione come SLOT nel file di intestazione.

Il secondo è moc magic. Chiama attraverso il sistema meta-oggetto. Non ho mai approfondito questo argomento più a fondo ... ha funzionato. :-)

Ok, non la migliore spiegazione. Se volete maggiori informazioni:

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

buona legge, ma ... interessante solo se siete interessati nel funzionamento più profondi della Qt. IMHO è necessario solo se vuoi sviluppare Qt stesso.