QT Callback System noch nicht ganz verstanden



  • zum make unter windows: prinzipiell richtig, aber ich hatte z.b. mal irgendein anderes make tool unter windows installiert, was mit qt nicht gearbeitet hat.
    und dann musste ich immer "make.bat" aufrufen, was aber wie du schon sagtest eine "verknuepfung" auf "mingw32-make" ist.
    und da hab ich mir halt angewoehnt gleich "mingw32-make" zu nutzen, dann ist es auch klar welches make tool es ist.

    was das fuer ein anderes make tool war - frag mich nicht das system gibts nicht mehr, kam mir auch komisch vor. aber meine qt projekte hat es nicht kompiliert.

    mfg,
    julian



  • also der QT Command Prompt verrät mir, dass meine QTDIR Variable auf F:\QT\4.3.1 gesetzt ist. Wenn ich nun (im QT Command Prompt) in meinen Projektordner wechsele und make oder auch make "qt (3).pro" eingebe bekomme ich weiterhin ein freundliches:

    mingw32-make: *** No rule to make target 'qt', needed by 'makefile'. Stop.

    Ist das jetzt das entgültige aus für meine GUI Programmierungs Zukunft?



  • probier mal, dem pro file einen namen ohne leerzeichen zu geben und nochmal mingw32-make (oder auch nur make) auszufuehren.

    hast du vllt. mehrere qt versionen installiert?
    ich hatte mal unter einem linux system das problem, dass ich in einem qt4-projekt qmake von qt3 ausgefuehrt habe, da hatte dann make auch probleme.

    alfonsospringer schrieb:

    Ist das jetzt das entgültige aus für meine GUI Programmierungs Zukunft?

    noe.

    mfg,
    julian



  • es tut sich was !!!!! Er scheint zu kompiliereen doch leider gibt es Fehler. Diesmal ist es aber zu viel zum abschreiben deswegen die Grafik

    http://img502.imageshack.us/img502/1892/fehleryo3.th.png

    ->Vielen dank für eure Geduld (das bild läd sehr lange)



  • schonmal was von copy&paste gehoert?

    also zum fehler:
    "undefined vtable ..." gibts meist, wenn nicht alle headers und sources im pro file eingetragen sind.
    alle headers mit Q_OBJECT muessen unbedingt im pro file stehen, am besten aber alle headers (und zugehoerige sources).
    allerdings keine automatisch generierten dateien (moc_xxx, ui_xxx.h, ...).

    // edit: wenn du nicht weiterkommst poste hier mal den inhalt der pro datei in

    .

    mfg,
    julian



  • ######################################################################
    # Automatically generated by qmake (2.01a) Mi 19. Sep 21:59:14 2007
    ######################################################################

    TEMPLATE = app
    TARGET =
    DEPENDPATH += .
    INCLUDEPATH += .

    # Input
    SOURCES += main.cpp

    Bisschen kurz, oder? (Warum ist der Include Pfad nicht gesetzt? Ich dachte qmake macht das alles?)Wie kann man denn in der Konsole Copy&Paste anwenden? Da kann man doch nicht mal was markieren.



  • code tags !!!

    ######################################################################
    # Automatically generated by qmake (2.01a) Mi 19. Sep 21:59:14 2007
    ######################################################################
    
    TEMPLATE = app
    TARGET =
    DEPENDPATH += .
    INCLUDEPATH += .
    
    # Input
    SOURCES += main.cpp
    

    so da fehlt noch was denk ich.

    sowas wie

    TEMPLATE = app
    TARGET =
    DEPENDPATH += .
    INCLUDEPATH += .
    
    # Input
    SOURCES += main.cpp \
               alle.cpp \
               anderen.cpp \
               dateien.cpp
    
    HEADERS += alle.h \
               anderen.h \
               dateien.h
    

    da eben alle header- und implementationsdateien eintragen. auch mit pfad (relativ zu dem des pro files) also z.b.

    HEADERS += src/subdir/antother_subdir/blubb.h
    

    zum kopieren aus der konsole: markieren -> http://img03.picoodle.com/img/img03/9/9/19/f_cmdmarkierem_50e01a7.jpg
    dann wenn der kram markiert ist <enter> druecken und du hast es in der zwischenablage.
    nicht allzu komfortabel aber besser als immer screenshots hochzuladen. 😃

    mfg,
    julian



  • @copy und paste -> rechte maustaste -> markieren -> enter

    @problem:
    probier nochmal im projekt vz: qmake -project und dann qmake und dann make
    gibts noch dateien ausser der main.cpp?
    was steht in der main.cpp?
    ist das was in der main.cpp drinnen ist qt 3 oder 4? du hast 4 installiert?



  • jetzt sieht das ganze so aus:

    ######################################################################
    # Automatically generated by qmake (2.01a) Mi 19. Sep 21:59:14 2007
    ######################################################################

    TEMPLATE = app
    TARGET =
    DEPENDPATH += .
    INCLUDEPATH += .

    # Input
    SOURCES += main.cpp

    HEADERS += F:\Qt\4.3.1\include\Qt\QWidget.h \
    F:\Qt\4.3.1\include\Qt\QApplication.h \
    F:\Qt\4.3.1\include\Qt\QPushButton.h \
    F:\Qt\4.3.1\include\Qt\QLCDNumber.h \
    F:\Qt\4.3.1\include\Qt\QSlider.h \
    F:\Qt\4.3.1\include\QtGUI\QVBoxLayout.h \
    F:\Qt\4.3.1\include\QtGUI\QGridLayout.h

    qmake findet auch alle Dateien und erstellt ein Makefile - make liefert diesmal wieder fehler:

    make
    mingw32-make -f Makefile.Release
    mingw32-make[1]: Entering directory D:/Dokumente und Einstellungen//Eigen e Dateien/Eigene Programme/QT/QT (3)' g++ -c -O2 -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT\_LARGEFILE\_SUPPORT -DQT\_DLL -DQT\_NO\_DEBUG -DQT\_GUI\_LIB -DQT\_CORE\_LIB -DQT\_THREAD\_SUPPORT -DQT\_NEEDS _QMAIN -I"f:\\Qt\\4.3.1\\include\\QtCore" -I"f:\\Qt\\4.3.1\\include\\QtCore" -I"f:\\Qt\\4. 3.1\\include\\QtGui" -I"f:\\Qt\\4.3.1\\include\\QtGui" -I"f:\\Qt\\4.3.1\\include" -I"." - I"f:\\Qt\\4.3.1\\include\\ActiveQt" -I"release" -I"." -I"f:\\Qt\\4.3.1\\mkspecs\\win32-g ++" -o release\\main.o main.cpp g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-rel oc -Wl,-s -mthreads -Wl -Wl,-subsystem,windows -o "release\\qt.exe" release\\main. o -L"f:\\Qt\\4.3.1\\lib" -lmingw32 -lqtmain -lQtGui4 -lQtCore4 release\\main.o:main.cpp:(.text$_ZN8MyWidgetC1EP7QWidget[MyWidget::MyWidget(QWidg et*)]+0x2d5): undefined reference tovtable for LCDRange'
    release\main.o:main.cpp:(.text$_ZN8MyWidgetC1EP7QWidget[MyWidget::MyWidget(QWidg
    et*)]+0x2dc): undefined reference to vtable for LCDRange' collect2: ld returned 1 exit status mingw32-make[1]: *** [release\\qt.exe] Error 1 mingw32-make[1]: Leaving directoryD:/Dokumente und Einstellungen//Eigene
    Dateien/Eigene Programme/QT/QT (3)'
    mingw32-make: *** [release] Error 2

    Danke für den Tipp mit dem kopieren



  • aMan schrieb:

    probier nochmal im projekt vz: qmake -project und dann qmake und dann make

    Hast du das gemacht?

    Die Includefiles gehoeren btw nicht in die pro Datei. Und dir ist hoffentlich bewusst, das du qmake nach jedem veraender der pro Datei neu ausfuehren musst.



  • also:

    ich hab jetzt alles nochmal von vorn gemacht.
    Ich habe den Quelltext
    main.cpp:

    #include <QWidget.h>
    #include <QApplication.h>
    #include <QPushButton.h>
    #include <QLCDNumber.h>
    #include <QSlider.h>
    #include <QVBoxLayout.h>
    #include <QGridLayout.h>
    
    class LCDRange : public QWidget
    {
        Q_OBJECT
    
        public:
            LCDRange(QWidget *parent) : QWidget(parent)
            {
                QLCDNumber *lcd = new QLCDNumber(2);
                lcd->setSegmentStyle(QLCDNumber::Filled);
    
                slider = new QSlider(Qt::Horizontal);
                slider->setRange(0, 99);
                slider->setValue(0);
    
                connect(slider, SIGNAL(valueChanged(int)),lcd, SLOT(display(int)));
                connect(slider, SIGNAL(valueChanged(int)),this, SIGNAL(valueChanged(int)));
    
                QVBoxLayout *layout = new QVBoxLayout;
                layout->addWidget(lcd);
                layout->addWidget(slider);
                setLayout(layout);
            };
            int value() const
            {
                return slider->value();
            };
    
        public slots:
            void setValue(int value)
            {
                slider->setValue(value);
            }
        signals:
            void valueChanged(int newValue);
    
        private:
            QSlider *slider;
    };
    
    class MyWidget : public QWidget
    {
        public:
        MyWidget(QWidget *parent) : QWidget(parent)
        {
            quit = new QPushButton("Quit");
            quit->setFont(QFont("Times", 18, QFont::Bold));
    
            connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));
    
            grid = new QGridLayout;
            previousRange = 0;
    
            for (int row = 0; row < 3; ++row)
            {
                for (int column = 0; column < 3; ++column)
                {
                    LCDRange *lcdRange = new LCDRange(this);
                    grid->addWidget(lcdRange, row, column);
                    if (previousRange) connect(lcdRange, SIGNAL(valueChanged(int)),previousRange, SLOT(setValue(int)));
                    previousRange = lcdRange;
                };
            };
    
            layout = new QVBoxLayout();
            layout->addWidget(quit);
            layout->addLayout(grid);
            setLayout(layout);
         };
        private:
        QPushButton* quit;
        QGridLayout* grid;
        LCDRange* previousRange;
        QVBoxLayout* layout;
    };
    
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
        MyWidget widget(NULL);
        widget.show();
        return app.exec();
    };
    

    befindet sich in einem Verzeichnis mit dem namen qt (3)
    nun wechsele ich in der QT Konsole in dieses Verzeichnis und gebe "qmake -project" ein. Es entsteht eine .pro Datei mit dem Namen "QT (3).pro" ich benenne sie in "qt3.pro" um und gebe "qmake" ein. es entstehen eine "Makefile" eine "Makefile.RELEASE" und eine "Makefile.DEBUG". Nun gebe ich "make" ein und erhalte die oben genannte Fehlermeldung. Was machen?



  • Du hast mehrere Klassen die von QObject erben in einer Datei die vom Moc'ing (Q_OBJECT) betroffen ist.
    Tu' die Klasse "LCDRange" in eine separate Datei und es sollte gehen.



  • am besten die klasse in 2 dateien.
    lcdrange.h und lcdrange.cpp oder so.

    und dann

    ######################################################################
    # Automatically generated by qmake (2.01a) Mi 19. Sep 21:59:14 2007
    ######################################################################
    
    TEMPLATE = app
    TARGET =
    DEPENDPATH += .
    INCLUDEPATH += .
    
    # Input
    SOURCES += main.cpp \
               lcdrange.cpp
    
    HEADERS += lcdrange.h
    

    und BITTE nutze verdammtnochmal CODE TAGS!

    mfg,
    julian



  • Wenn du mir sagst was code tags sein sollen... Kommentare?


  • Mod

    alfonsospringer schrieb:

    Wenn du mir sagst was code tags sein sollen... Kommentare?

    Nein, das sind die eckigen klammern in denen code,/code oder cpp, /cpp steht.
    Sie dienen dem Codehighlighting und machen somit den Code lesbarer.
    Sie zu nutzen erhöhen die Erfolgschancen eines Threads drastisch 😉



  • Juhu ! Es klappt! Warum muss man denn die Klassen in seperate Dateien fassen?

    ->Gibt es sowas wie qmake (zum erzeugen von makefiles) auch für normales c++ ohne qt?



  • qmake kann man fuer normales cpp auch verwenden.
    ansonsten gibts afaik die autotools und cmake hat wahrscheinlich auch etwas in der art..

    schau mal im artikelforum nach..



  • Wenn ich die Makefile für mein stan-dart HalloWelt Programm mit qmake -project und qmake erzeuge kann ich diese zwar (mit make) zu einem lauffähigen Programm kompilieren (0 Fehler, 0 Warnungen), aber es wird kein Text ausgegeben. Das Fenster bleibt schwarz bis auf das:

    Drücken Sie eine beliebige Taste . . .



  • komisch, bei mir gehts..

    probier vielleicht in der pro datei QT -= gui
    http://doc.trolltech.com/4.2/qmake-project-files.html#declaring-qt-libraries



  • immer noch das selbe Problem... Und ich muss wirklich nirgendwo ausser im Quelltext auf iostream verweisen?


Anmelden zum Antworten