PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Qt - SIGNAL und Q_OBJECT



foobar
28-02-2006, 15:31
hallo erstmal
ich hab vor kurzem mit der Qt-programmierung begonnen und bin schon recht bald auf ein problem gestoßen bei dem ich nicht weiterkomme
deshalb hab ich mich prompt hier registriert damit ich euch bitten kann mir bei der lösung ein wenig zu helfen :)

also: ich bin dabei ein programm mit einem eigenen kleinen widget zu programmieren das auch ein SIGNAL besitzen soll

um euch meinen eigenen code zu ersparen beziehe ich mich mal auf das entsprechende trolltech tutorial (http://doc.trolltech.com/3.3/tutorial1-07.html)
denn der dürfte recht fehlerfrei sein aber es tritt das selbe problem auf wie bei meinem eigenen projekt

das problem: er will es nicht kompilieren weder aus kdevelop3 heraus noch direkt auf der kommandozeile
(ich poste hier mal nur die ausgabe auf der kommandozeile)


g++ -c -pipe -Wall -W -O2 -D_REENTRANT -DQT_NO_DEBUG -DQT_THREAD_SUPPORT -DQT_SHARED -DQT_TABLET_SUPPORT -I/usr/share/qt3/mkspecs/default -I. -I. -I/usr/include/qt3 -o lcdrange.o lcdrange.cpp
g++ -c -pipe -Wall -W -O2 -D_REENTRANT -DQT_NO_DEBUG -DQT_THREAD_SUPPORT -DQT_SHARED -DQT_TABLET_SUPPORT -I/usr/share/qt3/mkspecs/default -I. -I. -I/usr/include/qt3 -o main.o main.cpp
/usr/share/qt3/bin/moc lcdrange.h -o moc_lcdrange.cpp
g++ -c -pipe -Wall -W -O2 -D_REENTRANT -DQT_NO_DEBUG -DQT_THREAD_SUPPORT -DQT_SHARED -DQT_TABLET_SUPPORT -I/usr/share/qt3/mkspecs/default -I. -I. -I/usr/include/qt3 -o moc_lcdrange.o moc_lcdrange.cpp
/usr/include/qt3/private/qucom_p.h:69: Warnung: »struct QUBuffer« hat virtuelle Funktionen aber nicht-virtuellen Destruktor
/usr/include/qt3/private/qucom_p.h:77: Warnung: »struct QUType« hat virtuelle Funktionen aber nicht-virtuellen Destruktor
/usr/include/qt3/private/qucom_p.h:104: Warnung: »struct QUType_Null« hat virtuelle Funktionen aber nicht-virtuellen Destruktor
/usr/include/qt3/private/qucom_p.h:287: Warnung: »struct QUType_enum« hat virtuelle Funktionen aber nicht-virtuellen Destruktor
/usr/include/qt3/private/qucom_p.h:307: Warnung: »struct QUType_ptr« hat virtuelle Funktionen aber nicht-virtuellen Destruktor
/usr/include/qt3/private/qucom_p.h:326: Warnung: »struct QUType_iface« hat virtuelle Funktionen aber nicht-virtuellen Destruktor
/usr/include/qt3/private/qucom_p.h:345: Warnung: »struct QUType_idisp« hat virtuelle Funktionen aber nicht-virtuellen Destruktor
/usr/include/qt3/private/qucom_p.h:364: Warnung: »struct QUType_bool« hat virtuelle Funktionen aber nicht-virtuellen Destruktor
/usr/include/qt3/private/qucom_p.h:383: Warnung: »struct QUType_int« hat virtuelle Funktionen aber nicht-virtuellen Destruktor
/usr/include/qt3/private/qucom_p.h:403: Warnung: »struct QUType_double« hat virtuelle Funktionen aber nicht-virtuellen Destruktor
/usr/include/qt3/private/qucom_p.h:423: Warnung: »struct QUType_charstar« hat virtuelle Funktionen aber nicht-virtuellen Destruktor
/usr/include/qt3/private/qucom_p.h:444: Warnung: »struct QUType_QString« hat virtuelle Funktionen aber nicht-virtuellen Destruktor
/usr/include/qt3/private/qucomextra_p.h:65: Warnung: »struct QUType_QVariant« hat virtuelle Funktionen aber nicht-virtuellen Destruktor
/usr/include/qt3/private/qucomextra_p.h:87: Warnung: »struct QUType_varptr« hat virtuelle Funktionen aber nicht-virtuellen Destruktor
g++ -o t7 lcdrange.o main.o moc_lcdrange.o -L/usr/share/qt3/lib -L/usr/X11R6/lib -lqt-mt -lXext -lX11 -lm -lpthread
/usr/lib/gcc/i486-linux-gnu/4.0.2/../../../../lib/crt1.o: In function `_start':
../sysdeps/i386/elf/start.S:115: undefined reference to `main'
collect2: ld gab 1 als Ende-Status zurück
make: *** [t7] Fehler 1

(vorher natürlich qmake -project und qmake)

nach einigem rumprobieren bin ich dann darauf gekommen das das problem wohl irgendwie mit dem Q_OBJECT makro zu tun hat denn wenn ich den weglasse kann ich es kompilieren und starten

nach einigem google'n bin ich auf nichts brauchbareres gekommen als nochmal alles ausser den quellen zu löschen und neu zu kompilieren was dann wohl die "moc_*.cpp" dateien erstellen soll aber geholfen hat es bei mir nicht

mein system:
OS: linux ubuntu breezy badger
Qt: 3.3.4
g++: 4.0 und 3.4

ich wär sehr dankbar wenn mir jemand helfen könnte ich komme ansonsten nicht weiter : /

anda_skoa
28-02-2006, 16:47
Dem Linker nach zu urteilen findet er die Funktion main() nicht.

Allerdings ist komisch, daß es dann ohne Q_OBJECT macro gehen soll.

Wie sieht denn deine main.cpp aus?

Ciao,
_

foobar
28-02-2006, 19:34
im prinzip sind alle sourcen unter dem genannten link zu trolltech: http://doc.trolltech.com/3.3/tutorial1-07.html zu finden aber ich poste sie hier nochmal
main.cpp


/************************************************** **************
**
** Qt tutorial 7
**
************************************************** **************/

#include <qapplication.h>
#include <qpushbutton.h>
#include <qlcdnumber.h>
#include <qfont.h>
#include <qvbox.h>
#include <qgrid.h>

#include "lcdrange.h"


class MyWidget : public QVBox
{
public:
MyWidget( QWidget *parent=0, const char *name=0 );
};


MyWidget::MyWidget( QWidget *parent, const char *name )
: QVBox( parent, name )
{
QPushButton *quit = new QPushButton( "Quit", this, "quit" );
quit->setFont( QFont( "Times", 18, QFont::Bold ) );

connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) );

QGrid *grid = new QGrid( 4, this );

LCDRange *previous = 0;
for( int r = 0 ; r < 4 ; r++ ) {
for( int c = 0 ; c < 4 ; c++ ) {
LCDRange* lr = new LCDRange( grid );
if ( previous )
connect( lr, SIGNAL(valueChanged(int)),
previous, SLOT(setValue(int)) );
previous = lr;
}
}
}


int main( int argc, char **argv )
{
QApplication a( argc, argv );

MyWidget w;
a.setMainWidget( &w );
w.show();
return a.exec();
}

lcdrange.cpp


/************************************************** **************
**
** Implementation of LCDRange class, Qt tutorial 7
**
************************************************** **************/

#include "lcdrange.h"

#include <qslider.h>
#include <qlcdnumber.h>

LCDRange::LCDRange( QWidget *parent, const char *name )
: QVBox( parent, name )
{
QLCDNumber *lcd = new QLCDNumber( 2, this, "lcd" );
slider = new QSlider( Horizontal, this, "slider" );
slider->setRange( 0, 99 );
slider->setValue( 0 );
connect( slider, SIGNAL(valueChanged(int)),
lcd, SLOT(display(int)) );
connect( slider, SIGNAL(valueChanged(int)),
SIGNAL(valueChanged(int)) );
}

int LCDRange::value() const
{
return slider->value();
}

void LCDRange::setValue( int value )
{
slider->setValue( value );
}

lcdrange.h


/************************************************** **************
**
** Definition of LCDRange class, Qt tutorial 7
**
************************************************** **************/

#ifndef LCDRANGE_H
#define LCDRANGE_H

#include <qvbox.h>

class QSlider;


class LCDRange : public QVBox
{
Q_OBJECT
public:
LCDRange( QWidget *parent=0, const char *name=0 );

int value() const;

public slots:
void setValue( int );

signals:
void valueChanged( int );

private:
QSlider *slider;
};


#endif // LCDRANGE_H

foobar
05-03-2006, 23:09
nagut ich hab das ganze jetzt mitlerweile auf einem anderen rechner mit ähnlicher konfiguration zum laufen gebracht
ich werde evtl. nochmal Qt und alles was dazu gehört neu installieren hoffentlich erledigt sich das problem damit...