View Full Version : [QT / C++ ] Virtual slot ed ereditarietà
Wing_Zero
04-08-2010, 02:14
Salve a tutti. Ho un problemone che non riesco a risolvere.
Ho un classe puramente virtuale,(alias interfaccia ):
class MovieParser : public QWidget {
public:
//funzioni virtuali
public slots:
virtual void setChoice(QString choice)=0;
};
Ed la classe che estende quella virtuale:
class FilmupXmlParser : public SyncHTTP, public MovieParser
{
public:
//implementazioni funzioni virtuali
public slots:
void setChoice(QString choice);
Ora, così facendo compila tutto, ma poi quando connetto lo SLOT ad un SIGNAL a runtime non riesco a trovare lo SLOT:
"Object::connect: No such slot QWidget::setChoice(QString)"
Pensavo che l'errore fosse che ho ho inserito la macro Q_OBJECT nelle 2 classi...ma inserendola ho l'errore:
"undefined reference to vtable"
Non riesco proprio a risolvere...eppure gli slot virtuali sono ammessi e si possono usare.... Cosa sto sbagliando?
Grazie a chiunque si interessasse.
Wing
Wing_Zero
04-08-2010, 02:28
Risolto -.-"
QT Creator è abbastanza fatto con i piedi evidentemente. visto che non è l aprima volta che mi capita.
Anche avendogli dato rebuild-all, rifacendogli far fare il qmake dava sempre lo stesso errore.
Ho cancellato a mano il makefile ed ora compila. assurdo -.-".
Per definire un custom slot/signal devi inserire la macro Q_OBJECT nel header della classe. Questo l'hai capito mi sembra.
Quando si fa una modifica di questo tipo, non solo vanno rigenerati i binari, ma anche i moc. Per fare questo da linea di comando andrebbe rieseguito qmake.
Probabilmente avresti risolto il problema andando in Build->Clean All e poi Run qmake
In sostanza Qt Creator non ha capito che c'era stata la modifica dell'aggiunta di Q_OBJECT.
Risolto -.-"
QT Creator è abbastanza fatto con i piedi evidentemente. visto che non è l aprima volta che mi capita. [...]
In effetti, anche se lo trovo comodissimo, anche io ho qualche problema con questa versione, in particolare con l'editor (che mi da un sacco di "sottolineature rosse" quando uso Boost salvo poi compilare e funzionare benissimo).
Per fortuna con Qt 4.7 dovrebbero distribuire la nuova versione (che è anche assai ganza da vedere :) )
Sì, l'ultima non entusiasma nemmeno me.
Con la prossima ci sarà la rivoluzione di QtQuick e Qml :sbav:
Non oso pensare a come verrà rivoluzionata l'interfaccia grafica dei programmi, soprattutto nell'ambito mobile :sbav:
Wing_Zero
05-08-2010, 09:57
Per definire un custom slot/signal devi inserire la macro Q_OBJECT nel header della classe. Questo l'hai capito mi sembra.
Quando si fa una modifica di questo tipo, non solo vanno rigenerati i binari, ma anche i moc. Per fare questo da linea di comando andrebbe rieseguito qmake.
Probabilmente avresti risolto il problema andando in Build->Clean All e poi Run qmake
In sostanza Qt Creator non ha capito che c'era stata la modifica dell'aggiunta di Q_OBJECT.
Sisi ero già a conoscenza di ciò:
Anche avendogli dato rebuild-all, rifacendogli far fare il qmake dava sempre lo stesso errore.
Ho cancellato a mano il makefile ed ora compila. assurdo -.-".
Il problema è qt creator che ha qualche grossa lacuna ancora -.-".
Cmq a titolo informativo ho notato che su ubuntu è molto più veloce...sia a compilare sia l'applicazione una volta compilata...
Probabilmente dipende in primis dal fatto che il gcc è molto piu' veloce del minggw32...però che anche l'applicazione compilata, quando devo accedere al database sia molto più reattiva non me lo spiego...boh...merito di ext4?
Il problema è che magari con il clean all avresti eliminato i moc file, magari il rebuild all compila solamente e non crea i moc file, ma questa è solo una supposizione.
Dipende "quanto" più reattiva ed anche "quando" è più reattiva, solo al primo accesso al db o sempre (magari è in relazione con il sistema di caching).
Wing_Zero
05-08-2010, 14:20
Il problema è che magari con il clean all avresti eliminato i moc file, magari il rebuild all compila solamente e non crea i moc file, ma questa è solo una supposizione.
Dipende "quanto" più reattiva ed anche "quando" è più reattiva, solo al primo accesso al db o sempre (magari è in relazione con il sistema di caching).
quanto: abbastanza da notarlo od occhio nudo. circa il doppio piu' veloce nelle operazioni di inserimento /delete/ update
quando: praticamente sempre...
quanto: abbastanza da notarlo od occhio nudo. circa il doppio piu' veloce nelle operazioni di inserimento /delete/ update
quando: praticamente sempre...
Non è poco...
Hai compilato in versione release ?
Wing_Zero
05-08-2010, 17:32
Non è poco...
Hai compilato in versione release ?
si in entrambe le parti.
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.