Seite 1 von 1

[gelöst] Connect funktioniert nicht!

Verfasst: 18. Juni 2005 15:05
von pauli8585
Hi!

Hoffentlich könnt ihr mir helfen. Ich programmiere erst seit ein paar Tagen mit qt (unter Linux). Beim folgenden Programm funktioniert die connect Methode nicht. Bitte schaut nicht auf den Programmierstil. :-)

Wo ist der Fehler?

mfg
Pauli

#include <qt3/qapplication.h>
#include <qt3/qpushbutton.h>
#include <qt3/qlineedit.h>
#include <qt3/qlabel.h>

class Form : public QWidget
{
private:
QLabel *Label;
public:
Form( QWidget *parent=0, const char *name=0 );
public slots:
void changeText();
};

Form::Form( QWidget *parent, const char*name ): QWidget( parent, name)
{
setMinimumSize(200, 120);
setMaximumSize(200, 120);

QPushButton *bttn = new QPushButton( "Klick", this, "Klick" );
bttn->setGeometry( 62, 20, 75, 30 );

Label = new QLabel( this );
Label->setText("TEST");
Label->setGeometry (0,0,60,20);
Label->setFrameStyle( QFrame::Panel | QFrame::Sunken );

QLineEdit *textBox = new QLineEdit("TextBox", this, "textBox" );
textBox->setGeometry(50,50,100,50);

connect( bttn, SIGNAL(clicked()), this, SLOT(changeText()) );
}

void Form::changeText()
{
Label->setText("XNJKLNK");
}

int main( int argc, char **argv)
{
QApplication a( argc, argv );
Form w;
a.setMainWidget( &w );
w.show();
return a.exec();
}

Verfasst: 18. Juni 2005 16:07
von FlorianBecker
Ja, und was genau funktioniert da nicht?

Hast du Q_OBJECT in der Definition gesetzt? Wird ein moc File erstellt und einkompiliert? Ist changeText als Slot definiert?

Ok, ich habe deine Definition übersehen, dachte, das ist eine weitere Datei, also du musst Q_OBJECT setzten, dann wird das auch gehen.

...
class Form

Q_OBJECT

public: ...

Verfasst: 20. Juni 2005 14:44
von pauli8585
Danke für die Antwort!

Wenn ich Q_OBJECT einfüge bekomme ich folgende Fehlermeldung:

./compile.sh 1
1.o(.text+0x2d): In function `Form::Form[not-in-charge](QWidget*, char const*)':
: undefined reference to `vtable for Form'
1.o(.text+0x39): In function `Form::Form[not-in-charge](QWidget*, char const*)':
: undefined reference to `vtable for Form'
1.o(.text+0x3ab): In function `Form::Form[in-charge](QWidget*, char const*)':
: undefined reference to `vtable for Form'
1.o(.text+0x3b7): In function `Form::Form[in-charge](QWidget*, char const*)':
: undefined reference to `vtable for Form'
1.o(.gnu.linkonce.t._ZN4FormD1Ev+0xb): In function `Form::~Form [in-charge]()':
: undefined reference to `vtable for Form'
1.o(.gnu.linkonce.t._ZN4FormD1Ev+0x17): more undefined references to `vtable for Form' follow
collect2: ld returned 1 exit status

mfg
Pauli

Verfasst: 20. Juni 2005 14:52
von taki
Du musst noch die .moc Datei einbinden.

In der letzten Zeile der Datei, die die Implementation enthält:

Code: Alles auswählen

#include "deinedatei.moc"
Allerdings muss das Buildsystem auch wissen, dass eine .moc Datei erzeugt und eingebunden werden muss. Wenn Du kdevelop verwendest, dann hilft das Makefile.am Howto weiter.

Wenn nicht, muss jemand anders weiter helfen, da kenn ich mich nicht aus. Vermute, dass qmake das auch selbst berücksichtigen kann, wenn die .pro Datei stimmt.

Verfasst: 20. Juni 2005 15:14
von FlorianBecker
Wenn du das qmake (*.pro) System von Qt nimmst macht er das normalerweise alles automatisch. Sollt das schon der Fall gewesen sein, und es ging trotzdem nicht, dann hast du vergessen erneut qmake auszuführen um ein neues Makefile zu erzeugen. qmake kann vieles, aber eben nicht alles, denn es kann ja nicht wissen, das du nun ein neues Q_OBJECT eingefügt hast. Denn das durchsucht er nämlich vor dem erstellen von Make Dateien.

Verfasst: 20. Juni 2005 15:45
von pauli8585
1.pro Datei:

SOURCES = 1.cpp
CONFIG += qt warn_on release

--> qmake -o Makefile 1.pro

Habe jetzt diese 1.pro Datei erstellt,
mit qmake ein Makefile gemacht
und anschließend mit make kompiliert.

Leider erhalte ich noch immer die gleiche
Fehlermeldung.

mfg
Pauli

Verfasst: 20. Juni 2005 18:42
von lepsai
ist die .moc eingebunden?

Verfasst: 20. Juni 2005 18:51
von pauli8585
Hi!

Vielen Dank für Eure Antworten!!!

@lepsai: Danke, ich habe jetzt noch die .moc Datei mit einbezogen!

mfg
Pauli