[QT] Funktion ausführen



  • Ich bin ziemlich neu in QT und verstehe das SIGNAL + SLOT Prinzip nicht wirklich. Ich habe mir schon alle möglichen Artikel, Tutorials, etc. durchgelesen doch ich bin nicht weiter gekommen. Hier erst einmal mein Quellcode:

    #include <QApplication>
     #include <QFont>
     #include <QPushButton>
     #include <QVBoxLayout>
     #include <QWidget>
     #include <QMainWindow>
    
     class MyWidget : public QWidget
     {
     public:
         MyWidget(QWidget *parent = 0)
         {
             QPushButton *quit = new QPushButton(tr("Quit"));
             quit->setFont(QFont("Times", 18, QFont::Bold));
    
             connect(quit, SIGNAL(clicked()), this, SLOT(buttonClicked()));
    
             QVBoxLayout *layout = new QVBoxLayout;
             layout->addWidget(quit);
             setLayout(layout);
         }
    
     public slots:
         void buttonClicked() {
        	 qWarning("Button pressed!");
         }
     };
    
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
        MyWidget widget;
        widget.show();
        return app.exec();
    }
    

    Ich möchte nur das das Programm die Funktion buttonClicked() ausführt wenn ich auf den Button drücke 😞



  • du musst entweder am Ende der Datei die vom moc erstellte Datei moc_DATEINAME.cpp einbinden oder die Klassendefinion in eine eigene Datei auslagern



  • Danke schon mal 😉

    Ich habe nun aber ein neues Problem. Wenn ich folgenden Befehl ausführe "moc.exe main.cpp -o moc_main.cpp" bekomme ich die Fehlermeldung: main.cpp:84: Error: Class declarations lacks Q_OBJECT macro.

    Weiß hier jmd weiter? 😕



  • newbie1 schrieb:

    main.cpp:84: Error: Class declarations lacks Q_OBJECT macro.

    Die Fehlermeldung beschreibt doch exakt, wo das Problem liegt.
    Alle Klassen die den Signals/Slots Mechanismus verwenden, müssen auch das Q_OBJECT Makro benutzen.

    Beispiel:

    class Test : public QWidget
    {
         Q_OBJECT
    
    public:
         Test();
    
         // ...
    };
    


  • Ich habe jetzt noch einmal die andere Variante ausprobiert, indem ich die Klasse ausgelagert habe. Dennoch tut sich nichts:

    main.cpp:

    #include <QtGui>
    
     #include "mainwindow.h"
    
     int main(int argc, char *argv[])
     {
         QApplication app(argc, argv);
         MyWidget widget;
         widget.show();
         return app.exec();
     }
    

    mainwindow.h:

    #ifndef MAINWINDOW_H
     #define MAINWINDOW_H
    
     #include <QApplication>
     #include <QFont>
     #include <QLCDNumber>
     #include <QPushButton>
     #include <QSlider>
     #include <QVBoxLayout>
     #include <QWidget>
    
     class MyWidget : public QWidget
     {
         Q_OBJECT
    
     public:
         MyWidget(QWidget *parent = 0);
    
     public slots:
    	 void TuWas();
     };
    
     #endif
    

    mainwindow.cpp:

    #include <QtGui>
    
     #include "mainwindow.h"
    
     MyWidget::MyWidget(QWidget *parent)
         : QWidget(parent)
     {
         QPushButton *quit = new QPushButton(tr("Quit"));
         quit->setFont(QFont("Times", 18, QFont::Bold));
    
         connect(quit, SIGNAL(clicked()), this, SLOT(TuWas()));
    
         QVBoxLayout *layout = new QVBoxLayout;
         layout->addWidget(quit);
         setLayout(layout);
     }
    
     void MyWidget::TuWas()
     {
    	 qWarning("ENDLICH!");
     }
    


  • Soweit ich das erkennen kann (ohne es jetzt extra kompiliert und getestet zu haben) sieht dein Code in Ordnung aus.

    Was genau "tut sich" denn nicht?
    Wenn zum Beispiel irgendwelche Slots nicht richtig connected wären, würde die Qt-Bibliothek zumindest entsprechende Fehlermeldungen im Debug ausgeben.

    Das sich gar überhaupt nichts tut, ist eigentlich schwer vorstellbar.
    Entweder bekommst du beim Versuch zu kompilieren Fehler ausgeworfen, oder aber wenn erfolgreich kompiliert wurde, zumindest zur Laufzeit dann irgendetwas mitgeteilt.



  • Ich bekomme keine Fehlermeldung beim Kompilieren und auch nicht währen der Laufzeit. Wenn ich das Programm starte und den Button drücke tut sich aber auch nichts... -.-



  • Da ich es dir nicht geglaubt hatte, dass absolut gar nichts passiert, hab ich eben deinen Code nochmal 1:1 in die Dateien main.cpp, mainwindow.cpp, und mainwindow.h übernommen.

    Anschließend

    qmake -project
    qmake
    nmake
    

    in der Command Prompt meiner Entwicklungsumgebung eingegeben.

    Es kompilierte alles fehlerfrei.
    Anschließend noch das Programm getestet: auch hier klappte alles perfekt.
    Folge -> an deinem Code liegt das Problem wie erwartet nicht.
    Mit hoher Wahrscheinlichkeit existiert gar überhaupt kein Problem.

    Ich schätze du erwartest einfach, dass deine Ausgabe mit qWarning() wo hin geht, wo sie aber niemals wirklich ankommt.
    (Weshalb das so ist kann ich dir nicht sagen, es ist schließlich dein System und du musst wissen wo welcher Stream raus geht...)

    Um das Ganze richtig zu testen, solltest du deine Funktion mal zum Beispiel wie folgt umbauen:

    void MyWidget::TuWas()
    {
        //qWarning("ENDLICH!");
        setWindowTitle("ENDLICH!");
    }
    

    Das wird dir einfach den Fenstertitle ändern. Viel Glück!



  • danke, funktioniert alles 🙂


Anmelden zum Antworten