Newsgroup: it.comp.lang.c++
Titolo: QObject::connect: No such slot QLCDNumber::mod() - Dove sbaglio?

Ciao @tutti,
sto seguendo un tutorial di programmazione in QT.
Non riesco ad implementare correttamente uno slot da aggiungere ad una 
classe derivata.
Ottengo il seguente messaggio di errore:
QObject::connect: No such slot QLCDNumber::mod()
Mi pare di capire che il compilatore cerca lo slot "mod" nella classe 
QLCDNumber benché sia stato aggiunto alla classe mioLCD derivata da 
QLCDNumber.
Le parti da esaminare sono le seguenti:
class mioLCD : public QLCDNumber{
     public:
     mioLCD(uint,QWidget*,const char *);
     int ora;
     public slots:
     void mod();
};
mioLCD::mioLCD( uint a,QWidget* b, const char *c )
         : QLCDNumber( a,b,c ){
     ora=0;
}
void mioLCD::mod(){
     if (ora==0){
     setBinMode();
     ora=1;
     }
     else{
     setDecMode();
     ora=0;
     }
}
MyWidget::MyWidget( QWidget *parent, const char *name )
         : QVBox( parent, name )
{
...
...
mioLCD * lcdmio  = new mioLCD( 10, this, "lcd" );
QPushButton *mode=new QPushButton( "Base",this, "base");
connect( mode, SIGNAL(clicked()), lcdmio, SLOT(mod()));
}
Dove sbaglio?
Grazie!
Armando

 Dove sbaglio?
Avevo omesso la chiamata Q_OBJECT
Tuttavia inserendola nella classe mioLCD ottengo il seguente messaggio 
di errore:
miolcd.cpp:(.text+0x5a): undefined reference to `vtable for mioLCD'
Cosa sbaglio adesso?

 Cosa sbaglio adesso?
Sto adesso seguendo un altro tutorial per QT Designer.
Si č ripresentato lo stesso problema su un altro "programma" di prova.
Sbaglio qualcosa quando cerco di implementare una sottoclasse.
Non so se commetto errori nel linking o nel codice.
Ho pensato di inserire tutto in un unico file c++, ad eccezione del 
sorgente generato automaticamente da QT designer a partire da MainWindow.ui.
_____________________________________________
L'errore segnalato č il solito:
astro.cpp:(.text+0x41): undefined reference to `vtable for MainWindowImpl'
astro.cpp:(.text+0x49): undefined reference to `vtable for MainWindowImpl'
astro.cpp:(.text+0xf1): undefined reference to `vtable for MainWindowImpl'
...
...
...
astro.o:astro.cpp:(.text+0x2c9): more undefined references to `vtable 
for MainWindowImpl' follow
______________________________________________
mainwindow.h č l'header file generato da QT designer
Intendo usare MainWindowImpl che eredita la classe MainWindow (non 
editabile direttamente volendo continuare ad usare QT Designer) per 
implementare funzioni membro ad hoc
_______________________
Contenuto file 
src.pro
:
SOURCES =astro.cpp
TARGET =astro
DESTDIR =../bin
TEMPLATE = app
FORMS += MainWindow.ui
________________________
Contenuto file astro.cpp:
#include <qapplication.h>
#include <qmessagebox.h>
#include "MainWindow.h"
class MainWindowImpl: public MainWindow{
	Q_OBJECT
	public:
	MainWindowImpl(QWidget* parent = 0, const char* name = 0, bool modal = 
TRUE, WFlags fl = 0 );
	public slots:
	void Chiudi();
};
MainWindowImpl::MainWindowImpl(QWidget* parent, const char* name, bool 
modal, WFlags fl){
	MainWindow(parent,name,modal,fl);
}
void MainWindowImpl::Chiudi(){
	QMessageBox::information( this, "Lo slot chiudi funziona", "Ok", 
QMessageBox::Ok );
}
int main( int argc, char* argv[] )
{
   QApplication app( argc, argv );
   MainWindowImpl a;
   app.setMainWidget( &a );
   a.show();
   return app.exec();
}
________________________________________________
Per completezza segue lěheader file generato da QT Designer:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <qvariant.h>
#include <qpixmap.h>
#include <qdialog.h>
class QVBoxLayout;
class QHBoxLayout;
class QGridLayout;
class QSpacerItem;
class QFrame;
class QButtonGroup;
class QRadioButton;
class QGroupBox;
class QLabel;
class QSlider;
class MainWindow : public QDialog
{
     Q_OBJECT
public:
     MainWindow( QWidget* parent = 0, const char* name = 0, bool modal = 
FALSE, WFlags fl = 0 );
     ~MainWindow();
     QFrame* frame3;
     QButtonGroup* gSelezione;
     QRadioButton* BStars;
     QRadioButton* Mes;
     QRadioButton* Hip;
     QGroupBox* gMagnitudine;
     QLabel* textLabel2;
     QSlider* MagLim;
     QLabel* pixmapLabel2;
public slots:
     virtual void Chiudi();
protected:
     QGridLayout* gSelezioneLayout;
protected slots:
     virtual void languageChange();
private:
     QPixmap image0;
};
#endif // MAINWINDOW_H
__________________________________________
Mi potete aiutare?
Grazie!
Armando

 astro.cpp:(.text+0x41): undefined reference to `vtable for MainWindowImpl'
Se mi ricordo bene uno dei casi in cui ottieni questo errore � quando 
nella classe in questione ci sono delle funzioni virtuali non definite.
E.

 Armando
Dai sempre un dist clean.
Poi rifai il qmake.
Ciao

 nella classe in questione ci sono delle funzioni virtuali non definite.
prima di tutto voglio ringraziarti per le indicazioni fornite.
Sapevo della necessità di implementare funzioni membro ereditate e 
virtual ma il sorgente generato automaticamente dal form ui già 
implementa la "sua" languageChange() per cui la mia classe che eredita 
non occorre che la reimplementi a meno di voler introdurre modifiche...
Ho iniziato a temere che con l'uso di QTDesigner occorresse poi 
ritoccare qualche file generato automaticamente.
Comunque ho risistemato la mia classe (che eredita) col suo header file 
e col suo sorgente separato...
Poi ho finalmente trovato l'errore: non dovevo inserire Q_OBJECT nella 
dichiarazione della mia classe che eredita...
Ciao!
Armando