PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : QT: Signals and slots



Asraniel
23-02-2005, 16:22
Hallo, ich bin C++ neuling und habe ein problem mit QT.
Ich möchte eine GUI machen, wie das geht habe ich nun herausgefunden.
Nun möchte ich machen das etwas passiert wenn ich auf einen button klicke, und zwar in meinem fall, dass der inhalt von textfeld a ins textfeld b kopiert wird.
hier der code:

#include <qapplication.h>
#include <qpushbutton.h>
#include <qtextedit.h>
#include <qwidget.h>

class Gui : public QWidget
{
private:
QTextEdit * text;
QTextEdit * trans;
public:
Gui( QWidget *parent=0, const char *name=0 );
public slots:
void convert();
};

void Gui::convert()
{
trans->setText(text->text());
}

Gui::Gui( QWidget *parent, const char *name )
: QWidget( parent, name )
{
setMinimumSize( 400, 200 );
setMaximumSize( 400, 200 );

text = new QTextEdit(this, "text");
trans = new QTextEdit(this, "text");
QPushButton * convert = new QPushButton( "Convert", this );

convert->setGeometry( 100, 150, 50, 30 );
connect( convert, SIGNAL(clicked()), this, SLOT(convert()) );

text->setTextFormat(Qt::PlainText);
text->setGeometry( 1, 1, 180, 100 );

trans->setTextFormat(Qt::PlainText);
trans->setGeometry( 190, 1, 180, 100 );
}


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

Gui gui;
gui.setGeometry( 100, 100, 200, 120 );
a.setMainWidget( &gui );
gui.show();

return a.exec();
}

ich bekommen als fehler folgendes:
QObject::connect: No such slot QWidget::convert()
QObject::connect: (sender name: 'unnamed')
QObject::connect: (receiver name: 'unnamed')


Warum?

BlueJay
23-02-2005, 16:49
public slots:
void convert();


ein Slot namens convert, fein.



Gui::Gui( QWidget *parent, const char *name )
: QWidget( parent, name )


Gib dem Kerlchen mal seinen Namen, damit man weiss, ob die Beschwerde von ihm kommt.



text = new QTextEdit(this, "text");
trans = new QTextEdit(this, "text");
QPushButton * convert = new QPushButton( "Convert", this );


Nun haben wir 2x denselben Namen in derselben Klasse. Wenn das mal gutgeht! :rolleyes:

so long,
BlueJay

Asraniel
23-02-2005, 19:58
danke :-) geht zwar noch immer nicht.. aber egal. Das ist mein neuster versuch


#include <qapplication.h>
#include <qpushbutton.h>
#include <qtextedit.h>
#include <qwidget.h>

class Gui : public QWidget
{
private:
QTextEdit * text;
QTextEdit * trans;
public:
Gui( QWidget *parent=0, const char *name=0 );
public slots:
void convert();
};

void Gui::convert()
{
trans->setText(text->text());
}

Gui::Gui( QWidget *parent, const char *name )
: QWidget( parent, name )
{
setMinimumSize( 400, 200 );
setMaximumSize( 400, 200 );

text = new QTextEdit(this, "text");
trans = new QTextEdit(this, "trans");
QPushButton * convert = new QPushButton( "Convert", this , "button");

convert->setGeometry( 100, 150, 50, 30 );
connect( convert, SIGNAL(clicked()), this, SLOT(convert()) );

text->setTextFormat(Qt::PlainText);
text->setGeometry( 1, 1, 180, 100 );

trans->setTextFormat(Qt::PlainText);
trans->setGeometry( 190, 1, 180, 100 );
}


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

Gui gui(0,"test");
gui.setGeometry( 100, 100, 200, 120 );
a.setMainWidget( &gui );
gui.show();

return a.exec();
}

und das ist der error:
QObject::connect: No such slot QWidget::convert()
QObject::connect: (sender name: 'button')
QObject::connect: (receiver name: 'test')

peschmae
23-02-2005, 23:00
class Gui : public QWidget
{
Q_OBJECT
private:
QTextEdit * text;

das Makro brauchst du in jeder Klasse die einen Slot implementiert oder so. Obs geht kann ich nicht testen, bei mir geht da noch gerade was anderes schief ;)

MfG Peschmä

Asraniel
24-02-2005, 11:41
daran hatte ich auchschon gedacht, aber es kommt leider folgender fehler beim kompilieren:


g++ -c -pipe -Wall -W -O2 -fomit-frame-pointer -pipe -march=i586 -mtune=pentiumpro -DQT_NO_DEBUG -DQT_SHARED -DQT_THREAD_SUPPORT -I/usr/lib/qt3/mkspecs/default -I. -I. -I/usr/lib/qt3//include -o kmorse.o kmorse.cpp
g++ -o morse_gui kmorse.o -L/usr/lib/qt3//lib -L/usr/X11R6/lib -lqt-mt -lXext -lX11 -lm
kmorse.o(.text+0xd3): In function `Gui::Gui(QWidget*, char const*)':
: undefined reference to `vtable for Gui'
kmorse.o(.text+0xdf): In function `Gui::Gui(QWidget*, char const*)':
: undefined reference to `vtable for Gui'
kmorse.o(.text+0x333): In function `Gui::Gui(QWidget*, char const*)':
: undefined reference to `vtable for Gui'
kmorse.o(.text+0x33f): In function `Gui::Gui(QWidget*, char const*)':
: undefined reference to `vtable for Gui'
kmorse.o(.text+0x5fc): In function `main':
: undefined reference to `vtable for Gui'
kmorse.o(.text+0x607): more undefined references to `vtable for Gui' follow
collect2: ld returned 1 exit status
make: *** [morse_gui] Fehler 1

BlueJay
24-02-2005, 19:55
void Gui::convert()
{
trans->setText(text->text());
}


...

QPushButton * convert = new QPushButton( "Convert", this , "button");

convert->setGeometry( 100, 150, 50, 30 );
connect( convert, SIGNAL(clicked()), this, SLOT(convert()) );


Die Dinger heissen ja immer noch gleich.
Ich schätze, du überplättest den Slot/die function mit dem QButton, und wech ist er!


und das ist der error:
QObject::connect: No such slot QWidget::convert()
QObject::connect: (sender name: 'button')
QObject::connect: (receiver name: 'test')

Da nennt er ja Roß und Reiter!
Ich denke mal, ausser dem fehlenden QOBJECT hast du die Function in 'text' mit dem Button gleichen Namens gehimmelt.

Probiere mal deinen QButton-Pointer umzubenennen (QPushButton* my_butt o.ä.)

so long,
BlueJay

Asraniel
24-02-2005, 20:09
danke, habe ich geändert, bringt aber nichts. Genau der gleiche fehler wie vorher :-(
kann es sein das das problem irgendwie von da her kommt das QWidget ein QObject ist, und man normalerweise Q_OBJECT verwendet UND die klasse von QObject erben sollte, aber das geht ja nicht weil QWidget ja schon von QObject erbt :-(


#include <qapplication.h>
#include <qpushbutton.h>
#include <qtextedit.h>
#include <qwidget.h>

class Gui : public QWidget
{
Q_OBJECT
private:
QTextEdit * text;
QTextEdit * trans;
public:
Gui( QWidget *parent=0, const char *name=0 );
public slots:
void convert();
};

void Gui::convert()
{
trans->setText(text->text());
}

Gui::Gui( QWidget *parent, const char *name )
: QWidget( parent, name )
{
setMinimumSize( 400, 200 );
setMaximumSize( 400, 200 );

text = new QTextEdit(this, "text");
trans = new QTextEdit(this, "trans");
QPushButton * my_butt = new QPushButton( "Convert", this , "button");

my_butt->setGeometry( 100, 150, 50, 30 );
connect( my_butt, SIGNAL(clicked()), this, SLOT(convert()) );

text->setTextFormat(Qt::PlainText);
text->setGeometry( 1, 1, 180, 100 );

trans->setTextFormat(Qt::PlainText);
trans->setGeometry( 190, 1, 180, 100 );
}

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

Gui gui(0,"test");
gui.setGeometry( 100, 100, 200, 120 );
a.setMainWidget( &gui );
gui.show();

return a.exec();
}

HangLoose
24-02-2005, 21:29
hi,

hab deinen code mal in drei dateien aufgeteilt.

gui.h



#ifndef GUI_H
#define GUI_H
#include <qwidget.h>

class QTextEdit;

class Gui : public QWidget
{
Q_OBJECT

public:
Gui( QWidget *parent=0, const char *name=0 );

public slots:
void convert();
private:
QTextEdit * text;
QTextEdit * trans;
};

#endif


gui.cpp



#include <qpushbutton.h>
#include <qtextedit.h>

#include "gui.h"

Gui::Gui( QWidget *parent, const char *name )
: QWidget( parent, name )
{
setMinimumSize( 400, 200 );
setMaximumSize( 400, 200 );

text = new QTextEdit(this, "text");
trans = new QTextEdit(this, "trans");
QPushButton * my_butt = new QPushButton( "Convert", this , "button");

my_butt->setGeometry( 100, 150, 50, 30 );
connect( my_butt, SIGNAL(clicked()), this, SLOT(convert()) );

text->setTextFormat(Qt::PlainText);
text->setGeometry( 1, 1, 180, 100 );

trans->setTextFormat(Qt::PlainText);
trans->setGeometry( 190, 1, 180, 100 );
}

void Gui::convert()
{
trans->setText(text->text());
}



main.cpp



#include <qapplication.h>
#include "gui.h"


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

Gui gui(0,"test");
gui.setGeometry( 100, 100, 200, 120 );
a.setMainWidget( &gui );
gui.show();

return a.exec();
}



er macht jetzt auch was er soll, hoffe ich wenigsten ;).


Gruß HL

BlueJay
24-02-2005, 22:30
yepp, das war's! Bin auch gerade drauf gekommen.

Ohne den gui.h hat er das moc nicht angefasst, deshalb gab es keinen neuen Slot, sondern nur das von QWidget vorgekaute Zeugs.

Beim "Zwangsmoccen" via Q_OBJECT gab's dann die ellenlange Fehlermeldung.

Um die Sache komplett zu machen, das zugehörige *.pro-File:



TEMPLATE = app
INCLUDEPATH += .

# Input
HEADERS += gui.h
SOURCES += main.cpp gui.cpp


Ich vermute, in deinem (ursprünglichem) pro ist das moc abgeschaltet.

so long,
BlueJay

Asraniel
25-02-2005, 06:35
danke vielmals :-) jetz kann ich wieder etwas weitermachen, bis ich auf mein nächstes problem treffen werde ;-) bin aber optimistisch das ich in ein paar monaten ganz gut c++ programmieren kann :-)