qt4 signals & slots



  • Guten Tag C++ Community,
    ich habe folgende Frage bzw. Problem. Ich versuche seit einen paar Tage mit qt4 zu arbeiten, leider ein bisschen erfolglos. Ich habe schon eine Gui für mein Programm erstellt, ich kann leider die verschiede Methoden nicht mit den buttons verbinden. Ich habe ein kleines Beispiel geschrieben, ich dachte vielleicht so klapps leider auch nicht, deshalb brauche ich eure Hilfe, ich weiß nicht wie ich meine eigene Methode mit dem Buttons verbinde. Ich habe schon viele Bücher gelesen und im Internet viel gegooglelt. Ich komme leider nicht weiter.

    #include <QApplication>
    #include <QFont>
    #include <QPushButton>
    #include <iostream.h>
    
    class MyClass : public QObject
        {
          Q_OBJECT
          public:MyClass();
          public slots:
          void Test();
        };
    
    void MyClass::Test()
    {
        cout << "Hallo\n";
    }
    
    int main(int argc, char* argv[])
    {
        QApplication app(argc, argv);
        QPushButton *hallo = new QPushButton("hallo");
        hallo->resize(75, 30);
        QObject::connect(hallo, SIGNAL(clicked()), qApp, SLOT(Test()));
        hallo->show();
        return app.exec();
    }
    


  • 1. nur iostream, nicht iostream.h

    2. Falscher Signal-Empfänger. qApp ist die aktuelle Instanz der QApplication, du brauchst aber eine Instanz der Klasse MyClass



  • danke für die schnelle Antwort

    2. Falscher Signal-Empfänger. qApp ist die aktuelle Instanz der QApplication, du brauchst aber eine Instanz der Klasse MyClass

    Wie mache ich die Instanz der Klasse MyClass???
    mfg



  • edguy schrieb:

    Wie mache ich die Instanz der Klasse MyClass???
    mfg

    😮

    Bevor du mit qt4 anfängst, solltest du dir erstmal ein C++-Grundlagenbuch zulegen, sonst wirst du nicht recht weit kommen und noch weniger verstehen von dem was du machst

    Tipp: was macht new?



  • ja das stimmt ich musste ich mir zu legen, ich dachte nur vielleicht schaffe ich es so, da dieser Gui ist für ein c Programm, das schon fertig ist. Ich kann Java und ich dachte ich würde mehr oder weniger klar kommen aber naja, das einzige was ich brauche ist meine eigene Methode mit dem Button zu verbinden



  • Schau dir die Doku an. Da stehen so viele Beispiel dazu drin.
    Im speziellen interessiert dich ja nicht irgend eine Instanz deiner Klasse, sondern genau "diese" in der der connect beim Konstruieren ausgeführt wird.
    Wenn du "diese" ins Englische übersetzen kannst, weißt du was du da reinschreiben musst 😛



  • danke für die antwort, ich habe es aber schon mit diese versucht

    QObject::connect(hallo, SIGNAL(clicked()), this, SLOT(Test()));
    

    und ich bekomme immer ein Fehler
    invalid use of `this' in non-member function
    mfg



  • l'abra d'or schrieb:

    Schau dir die Doku an. Da stehen so viele Beispiel dazu drin.
    Im speziellen interessiert dich ja nicht irgend eine Instanz deiner Klasse, sondern genau "diese" in der der connect beim Konstruieren ausgeführt wird.
    Wenn du "diese" ins Englische übersetzen kannst, weißt du was du da reinschreiben musst 😛

    bringt nur nix, wenn er den Connect in der main herstellen will 😉

    folgendes sollte funktionieren

    int main(int argc, char* argv[])
    {
        QApplication app(argc, argv);
        QPushButton *hallo = new QPushButton("hallo");
        hallo->resize(75, 30);
        MyClass* c = new MyClass();
        QObject::connect(hallo, SIGNAL(clicked()), c, SLOT(Test()));
        hallo->show();
        return app.exec();
    }
    

    warum, das darfst du selbst herausfinden. Und ich rate dir immernoch, erstmal C++-Grundlagen zu lernen. Das sind Trivialitäten, die sich nach ein paar simplen Übungen von selbst erklären



  • ja das sieht logisch aus, du erzugst ein Objekt, warum habe ich das nciht gedacht :S, naja ich bekomme ein Compilerfehler 😕

    MyClass* c = new MyClass();
    

    Ich habe schon angefangen C++ Bücher zu lesen nur ich finde irgendwie nicht was ich gerade brauche, ich eben gelesen wie man die Objekte erzugt, ich mache es so und bekomme einen Fehler 😕



  • sorry der Fehler : undefined reference to `vtable for MyClass'

    MyClass* c = new MyClass();
    


  • hrmpf, ja... kommt davon, weil alles in einer Datei steht -.-

    Du dürftest im Arbeitsverzeichnis eine "moc_*"-Datei finden. Diese musst du unterhalb der MyClass-Deklaration, aber oberhalb der main inkludieren (denk ich zumindest)

    Eleganter ist, du legst die MyClass-Deklaration und -Definition in separate Dateien

    myclass.h:

    #ifndef MYCLASS_H
    #define MYCLASS_H
    
    #include <QObject>
    
    class MyClass : public QObject
    {
        Q_OBJECT
    
    public:
        MyClass(QObject* parent = 0);
    
    public slots:
        void Test();
    };
    
    #endif
    

    myclass.cpp:

    #include "myclass.h"
    
    #include <iostream>
    
    MyClass::MyClass(QObject* parent)
    : QObject(parent)
    {
    }
    
    void MyClass::Test()
    {
        std::cout << "Hallo" << std::endl;
    }
    

    main.cpp:

    #include <QApplication>
    #include <QPushButton>
    
    #include "myclass.h"
    
    int main(int argc, char* argv[])
    {
        QApplication app(argc, argv);
        QPushButton* hallo = new QPushButton("hallo");
        hallo->resize(75, 30);
        MyClass* c = new MyClass();
        QObject::connect(hallo, SIGNAL(clicked()), c, SLOT(Test()));
        hallo->show();
        return app.exec();
    }
    

    (ungetestet)

    danach musst du überprüfen, ob in der .pro-Datei mindestens folgende Einträge enthalten sind:

    HEADERS = myclass.h
    SOURCES = myclass.cpp \
      main.cpp
    

    dann nur noch qmake ausführen und deinen Compiler anwerfen. et voila



  • zwutz schrieb:

    bringt nur nix, wenn er den Connect in der main herstellen will 😉

    Damn, hab irgendwie den Code für die Implementierung des Konstruktors aufgeschnappt. Kommt davon wenn man den Code nur überfliegt... Sry dafür.



  • alles klar, ich dachte, weil es ein kleines Programm ist, könnte ihc alles in einer Datei haben.
    Vielen Dank!



  • Ich habe jetzt so gemacht, ich bekomme folgene Fehler:

    #include <QObject>
    

    QObject: No such file or directory

    Ich bin jetzt etwas ratlos 😕



  • Aber du verwendest schon qmake? Und dein QTDIR ist korrekt gesetzt? Verwendest du den QT Creator?



  • Nein ihc nutze Codeblocks. Ich habe gerade versucht, die DAtei mit qmake zu erstellen gings aber irgendwie nicht



  • edguy schrieb:

    Ich habe gerade versucht, die DAtei mit qmake zu erstellen gings aber irgendwie nicht

    Höh?!? QObject mit qmake erstellen oder was?
    Richte erstmal deine Umgebung korrekt ein, damit du mit Qt arbeiten kannst. Dazu gehören halt auch die entsprechenden Include-directories!

    Btw.
    http://code.google.com/p/qtworkbench/
    Ist ein Plugin für codeblocks, mit dem du auch qt-Projekte in CodeBlocks bearbeiten kannst.



  • Höh?!? QObject mit qmake erstellen oder was?
    Richte erstmal deine Umgebung korrekt ein, damit du mit Qt arbeiten kannst. Dazu gehören halt auch die entsprechenden Include-directories!

    Nein ich habe es mit der qt Command Prommpt versucht, hat aber nicht geklappt.



  • es kann vorkommen, dass du das Modul mit angeben musst, damit die Klasse gefunden wird.

    Probier mal, ob #include <QtCore/QObject> funktioniert



  • zwutz schrieb:

    Probier mal, ob #include <QtCore/QObject> funktioniert

    Das liegt dann daran, dass QtCore nicht mit in den includes-path aufgenommen wurde. Und darauf verlassen sich einige Programme. Auch wenn das vorerst eine Lösung ist, würde ich schauen, QtCore/QtGui/... mit in den includes-path zu bekommen. qmake sollte (TM) das aber automatisch machen.


Anmelden zum Antworten