[erledigt] [QT4] Buttons mit Funktionen verknüpfen && Eigabe per Fenster?
-
hi
Im Internet( http://www.tutorials.de/forum/c-c/297938-qt4-slots-anlegen-und-verbinden.html ) fand ich folgendes( etwas geändert ):
## t.h ###ifndef _T_H_ #define _T_H_ #include <QObject> #include <QApplication> #include <QFont> #include <QPushButton> #include <QWidget> class Foo : public QObject { Q_OBJECT // Makro public: // Konstruktor Foo( QObject *parent = 0 ) : QObject(parent) { QObject::connect(this, SIGNAL(my_signal()), this, SLOT(my_slot())); } // -> Das muss sich doch irgendwie auf einen Button übertragen lassen :confused: // Funktion void fire_event() { emit my_signal(); } public slots: void my_slot() { qDebug("Executing slot my_slot()"); } signals: void my_signal(); }; #endif## TESTAPP.cpp ##
#include "t.h" #include <QApplication> #include <QFont> #include <QPushButton> #include <QWidget> int main(int argc, char **argv) { QApplication app(argc, argv); Foo f; f.fire_event(); // -> Ausgabe hier: Executing slot my_slot() return app.exec(); } // include the file that is generated by the moc //#include "t.moc"Nun wüsste ich gerne, wie ich einen Button mit einer Funktion verknüpfe, mein Versuch scheiterte kläglich:
Foo( QObject *parent = 0 ) : QObject(parent) { //. . . QPushButton button("test"); button.resize( 100, 50 ); button.setFont(QFont("Times", 18, QFont::Bold)); QPushButton::connect(&button, SIGNAL(my_signal()), qApp, SLOT(my_slot())); button.show(); }-> Der Button taucht kurz auf, verschwindet aber gleich wieder( liegt das vielleicht am Konstruktor, der nur kurz aktiv ist? )... mein Ziel ist also durch drücken des Buttons die Funktion( my_slot ) zu betätigen, haut aber leider nicht wirklich hin.
edit: Wenn ich den Code ausführen will, kommt folgende Meldung:
Object::connect: No such signal QPushButton::my_signal() Object::connect: (receiver name: 'qt')Wenn ich das das hier mache:
class ibutton : public QPushButton { public: ibutton( QPushButton* parent = 0 ) : QPushButton( parent ) {} public slots: void my_slot() { qDebug("Executing slot my_slot()"); } signals: void my_signal(); };wirft er folgende Fehlermeldung
In file included from TESTAPP.cpp:3: t.h: In constructor ‘Foo::Foo(QObject*)’: t.h:36: error: no matching function for call to ‘ibutton::ibutton(const char [5])’ t.h:14: note: candidates are: ibutton::ibutton(QPushButton*) t.h:12: note: ibutton::ibutton(const ibutton&) make: *** [TESTAPP.o] Error 1Nebenbei wüsste ich gerne wie man eine eingabe in Qt macht( ähnlich also wie std::cin, nur in einem Fenster o.ä ), leider habe ich nicht die geringste ahnung wie das gehen soll. Wenn jemand einen Link zu einem Tutorial kennt, wäre ich ihm sehr verbunden ihn hier zu posten

Vielen Dank im voraus!
-
Hi, also als erstes solltest du dir mal folgendes durch lesen: http://doc.trolltech.com/4.4/signalsandslots.html
Ein Button reagiert zum Beispiel auf clicked() das ist ein Signal:
http://doc.trolltech.com/4.4/qabstractbutton.html#signalsWenn dein Button jetzt aber auf 5xClick+1xRightclick reagieren soll, dann muss du DEINEM Button das erst bei bringen. Da du immer von QPushButton ableitest, kannst du das machen... siehe erster Link.
-
Also erstmal vielen Dank für die zwei Links.
jd schrieb:
Da du immer von QPushButton ableitest...
ja, doch sogar das geht schief, siehe letzte Fehlermeldung...
Das mit dem Signal stimmt natürlich, das habe ich übersehen, da ich bis dorthin noch gar nicht gekommen bin( wie gesagt mein Button erscheint nur ganz kurz ).
-
Sag mir doch einmal bitte auf was dein Button reagieren soll und was passieren soll. Dann kommen wir denke ich mal besser vorwärts. Einfach mal schritt für schritt sagen was du machen willst und was passieren soll. Dann können wir das in Code umsetzen.
so long
jd
-
Sorry, gut mache ich, also:
ersteinmal soll mein Button auf einen Klick reagieren( "clicked()" wie du sagtest )
Dann soll er eine Funktion ausführen( in meinem Code also "my_slot" ), die dann eben etwas zurückgeben soll, was interessiert ja ersteinmal nicht( ausgabe in der Konsole reicht ersteinmal )
Wenn man das Programm nun startet, soll ein Button erscheinen, auf den man klickt und in der Konsole sollte dann Text erscheinen.edit: hier ein vereinfachtes programm das es beschreiben sollte:
#include <QFrame> #include <QApplication> #include <QFont> #include <QPushButton> #include <QWidget> class ibutton : public QPushButton // -> Leite ibutton von QPushButton ab { ibutton( QPushButton *parent = 0 ) : QPushButton( parent ) {} // Konstruktor public slots: void display(int num); // irgendeine Funktion }; class LcdNumber : public QObject { Q_OBJECT // Makro public: LcdNumber(QObject *parent = 0); // Konstruktor public slots: void display(int num); }; void ibutton::display( int num ) { qDebug("Executing slot my_slot()"); // irgendeine Ausgabe } LcdNumber::LcdNumber( QObject *parent ) // Konstruktordefinition : QObject( parent ) { QWidget window; window.resize( 800, 800 ); ibutton button( "Button", &window ); // erstelle Button( in einem Fenster ) -> damit scheint er Probleme zu haben, siehe unten button.setGeometry( 50, 50. 100, 50 ); ibutton::connect( &button, SIGNAL(clicked()), &window, SLOT( closed() )); // verbinden, in "Slot()" sollte z.B. "display(1)" stehen window.show(); // anzeigen } int main( int argc, char **argv ) { QApplication app( argc, argv ); LcdNumber lcd; // Objekt erstellen, Konstruktor wird aufgerufen return app.exec(); }der Fehler ist wie oben
TESTAPP.cpp: In constructor ‘LcdNumber::LcdNumber(QObject*)’: TESTAPP.cpp:35: error: no matching function for call to ‘ibutton::ibutton(const char [7])’ TESTAPP.cpp:10: note: candidates are: ibutton::ibutton(QPushButton*) TESTAPP.cpp:9: note: ibutton::ibutton(const ibutton&) make: *** [TESTAPP.o] Error 1wobei das ja eigentlich gehen müsste, wo ist der Unterschied dazu: http://doc.trolltech.com/4.3/tutorial-t2.html
-
Dein Code ergibt bei mir keinen Sinn, warum willst du von QPushButton ableiten? das macht kein Sinn... Main leitet ab, wenn man dem was neues beibringen will. QPushButton kann aber alles was du willst.
Lass es mal etwas langsamer angehen:
test.h
#ifndef TEST_H_ #define TEST_H_ #include <QPushButton> class MyClass : public QObject { Q_OBJECT public: MyClass(); QPushButton *myButton; public slots: void mySlot(); }; #endif /*TEST_H_*/test.cpp
#include <QtGui> #include <QDebug> #include "test.h" MyClass::MyClass() { myButton = new QPushButton; connect(myButton, SIGNAL(clicked()), this, SLOT(mySlot())); myButton->setText(tr("Klick mich!")); myButton->show(); } void MyClass::mySlot() { qDebug() << "Du hast mich geklickt!"; }main.cpp
#include <QApplication> #include "test.h" int main(int argc, char* argv[]) { QApplication app(argc, argv); MyClass *myClass = new MyClass; app.exec(); }Das ist ein test-programm... Ohne schnick schnack. Dort ist das SIGNAL eingebunden und ein eigener SLOT.
so long
jd
-
BEVOR du irgendwelche Tutorials aus dem Netz ziehst, ohne überhaupt zu verstehen, was du da machst, solltest du dir erstmal die Qt-eigenen Tutorials (http://doc.trolltech.com/4.4/tutorials.html, oder über den assistant) ansehen.
Wenn du die durch hast, werden sich all deine Fragen großteils von selbst klären
-
ok, erstmal vielen Dank, dass ihr euch die Zeit dafür genommen habt
Nun funktioniert alles so, wie ich mir es vorgestellt habe.jd schrieb:
Dein Code ergibt bei mir keinen Sinn, warum willst du von QPushButton ableiten?
Von QPushButton wollte ich ableiten da immer diese Fehlermeldung kam
Object::connect: No such signal QPushButton::my_signal()Aber das hat sich ja ergeben durch deinen Post

mfg
double *T