Qt Anfängerproblem - PushButton mit beliebiger Funktion verbinden



  • moin,
    ich versuch seit einigen Tagen mit Qt-Bibliotheken zu Programmiern, um sowohl unter linux als auch Windows arbeiten zu können.
    Bisher hatte ich immer mit der MFC gearbeitet, und bin es gewohnt meine Fensterklasse anzulegen und darauf die Dinge wie Buttons, Textfelder, etc. zu platzieren. Jetzt möchte ich nicht für jeden Button eine neue Klasse erzeugen, in dem die Funktion Clicked() überschrieben wird, sondern eine Funktion in meiner Fensterklasse aufrufen. (Ja, anders rum wäre es wohl sehr gut OOP, aber bei so kleinen Programmen find ich es überflüssig.)

    Hier mal ein kurzer Beispiel Code:

    #include <QApplication>
        #include <QPushButton>
    	#include <QLabel>
    
        class MyWidget : public QWidget
        {
        public:
            MyWidget(QWidget *parent = 0);
    
    		QPushButton test;
    		QLabel label1;
    
    		void testit();
        };
    
        MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
        {
    		test.setText("&test");
    		test.setParent(this);
            test.setGeometry(10, 35, 40, 20);
    
    		label1.setText("hallo");
    		label1.setParent(this);
            label1.setGeometry(10, 60, 40, 20);
    
    		if(!connect(&test, SIGNAL(clicked()), METHOD(testit())))
    		{
    			label1.setText("Error");
    		}
    	}
    
    	void MyWidget::testit()
    	{
    		label1.hide();
    	}
    
        int main(int argc, char *argv[])
        {
            QApplication app(argc, argv);
            MyWidget widget;
            widget.setGeometry(200, 200, 500, 355);
            widget.show();
            return app.exec();
        }
    

    Wie ihr euch denken könnt steht hinterher "Error" in label1. Was muss ich machen, damit mein test-Button mit testit() verbunden wird?

    mfg Emperor_L0ser



  • Hast du schon das Qt Tutorial durchgearbeitet?

    Ansonsten kann es so gehen:

    Die Deklaration:

    class MyWidget : public QWidget
         {
             Q_OBJECT
         public:
             MyWidget(QWidget *parent = 0);
    
             QPushButton test;
             QLabel label1;
         public slots:
             void testit();
         };
    

    Die Verbindung:

    connect(&test, SIGNAL(clicked()), SLOT(testit()));
    


  • nach der änderung bekomme ich folgende Fehlermeldung:
    release\main.o(.text+0x80):main.cpp: undefined reference to vtable for MyWidget' release\\main.o(.text+0x87):main.cpp: undefined reference tovtable for MyWidget'
    release\main.o(.text+0x5f0):main.cpp: undefined reference to vtable for MyWidget' release\\main.o(.text+0x5f7):main.cpp: undefined reference tovtable for MyWidget'
    release\main.o(.text+0xbf3):main.cpp: undefined reference to vtable for MyWidget' release\\main.o(.text+0xbfa):main.cpp: more undefined references tovtable for MyWidget' follow
    collect2: ld returned 1 exit status

    ich hab anderswo bereits gelesen, dass ich eventuell ne .moc datei benötige zum einbinden, aber wie soll die aussehen?



  • Emperor-L0ser schrieb:

    nach der änderung bekomme ich folgende Fehlermeldung:
    release\main.o(.text+0x80):main.cpp: undefined reference to vtable for MyWidget' release\\main.o(.text+0x87):main.cpp: undefined reference tovtable for MyWidget'
    release\main.o(.text+0x5f0):main.cpp: undefined reference to vtable for MyWidget' release\\main.o(.text+0x5f7):main.cpp: undefined reference tovtable for MyWidget'
    release\main.o(.text+0xbf3):main.cpp: undefined reference to vtable for MyWidget' release\\main.o(.text+0xbfa):main.cpp: more undefined references tovtable for MyWidget' follow
    collect2: ld returned 1 exit status

    ich hab anderswo bereits gelesen, dass ich eventuell ne .moc datei benötige zum einbinden, aber wie soll die aussehen?

    Lies dir die Doku zu Signals und Slots durch. Auch im Tutorial wird das erklärt. Am einfachsten kann es aber so gehen:

    1. Pack die Sourcen in ein neues Verzeichnis
    2. Mach: qmake -project
    3. Mach: qmake <entstandene pro datei>.pro
    4. Mach: make
    5. Programm ausführen.



  • der fehler taucht wieder auf, ich werd mich nochmal in den tutorials umschauen, ob ich was übersehen habe, wenns ich dann immer noch probleme hab meld ich mich wieder


Log in to reply