qt4 signals & slots



  • 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.



  • mhhh ich weiß langsam nciht mehr was ich machen soll.
    Mit der Command Prompt komme ich nur bis make. Ich kann qmake -project schreiben und ist alles gut, wenn ich make ingebe. Kommt diesen Fehler Der Befehl "mingw32-make" ist entweder falsch geschrieben oder konnte nicht gefunden werden. Hat jemand eine Ahnung was ich falsch mache???



  • Nach einem "qmake -project" rufst du aber schon noch ein "qmake <insert_my_projectfile_name>.pro" auf? Denn erst das erstellt das Makefile.
    Mit welchem Compiler soll denn dein Qt-Projekt kompiliert werden? Evtl. vergessen (wie es eigentlich in der Qt-Doku steht...) ein korrektes QMAKESPEC zu setzen?



  • Es klapp immer noch nicht.Ich habe eben qmake projektname.pro eingeben dannn make und kommt immer noch den gleichen Fehler

    Ich möchte mit Codeblocks compilieren.

    Nach der Command Prompt sollte mein path richtig sein.
    -- qtdir set to C:\Qt\4.6.2
    -- PATH C:\Programm\CodeBlocks\MinGW\bin\bin to PATH
    -- Adding C:\WINDOWS\System32 to PATH
    -- QMAKESPEC set to win32-g++

    Ich denke das ist alles so richtig oder???


Anmelden zum Antworten