QT Callback System noch nicht ganz verstanden



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



  • haste probiert mit start->ausfuehren->cmd und zum programmvz wechseln und dann ausfuehren?

    ansonsten hab ich keine idee, aufm linux gehts.



  • ja, aber trotzdem danke



  • wenn du ein ganz "normales" c++ programm hast ohne qapplication, probier mal "CONFIG += qt" und "QT -= core" im pro file.
    ich hab mal qt-klassen in einem non-qt-programm benutzt, da ging es so.

    mfg,
    julian


Anmelden zum Antworten