Signal- Slot Mechanismus von QT3 und Q_OBJECT MACRO



  • Ich habe begonnen, mir das Toolkit QT anzuschauen und bin grade dabei, die beiden in der Dokumentation befindlichen Tutorials durchzuarbeiten. Bis zum 6. Kapitel des ersten Tutorials hatte ich gar keine Probleme. Beim 7. Kapitel fing es an und dort bin ich heute stehengeblieben. Nach langer Zeit konnte ich den abgetippten Code kompilieren und nun wird auch eine QT Anwendung erzeugt. Allerdings werden jede Menge Warnungen und Errors bezüglich meines Signals ausgegeben und es passiert auch nicht viel....

    Vielleicht kann mir ja einer helfen.... würde mich freuen hier der code:

    #include <stdio.h>
    #include <stdlib.h>
    #include "/usr/lib/qt3/include/qvbox.h"
    
    #ifndef IS_DEF
    
            #define IS_DEF
    
            class QSlider; /*only declaration here: no implementation is loaded */
    
            class Container : public QVBox
            {
                    Q_OBJECT
    
                    public:
                            Container (QWidget* parent = NULL, const char* name = NULL);
                            int value (void) const;
                    public slots:
                            void setValue (int);
                    signals:
                            void changeValue (int);
                    private:
                            QSlider* slider;
                    protected:
    
            };
    
    #endif
    

    hier die unit.cpp - Implementation der Klasse Container

    #include "unit.h"
    
    #include "/usr/lib/qt3/include/qslider.h"
    #include "/usr/lib/qt3/include/qlcdnumber.h"
    
    Container::Container (QWidget* parent, const char* name) : QVBox (parent, name)
    {
            QLCDNumber* lcd = new QLCDNumber (2, this, "lcd");
            slider = new QSlider (Horizontal, this, "slider");
            slider->setRange (0, 99);
            slider->setValue (0);
    
            connect (slider, SIGNAL (valueChanged (int)), lcd, SLOT (dispay (int)));
            connect (slider, SIGNAL (valueChanged (int)), SIGNAL (valueChanged (int)));
    
    }
    
    int Container::value (void) const
    {
            return slider->value ();
    }
    
    void Container::setValue (int value)
    {
            slider->setValue (value);
    }
    ~
    ~
    

    und hier die main....

    #include "/usr/lib/qt3/include/qapplication.h"
    #include "/usr/lib/qt3/include/qpushbutton.h"
    #include "/usr/lib/qt3/include/qlcdnumber.h"
    #include "/usr/lib/qt3/include/qfont.h"
    #include "/usr/lib/qt3/include/qvbox.h"
    #include "/usr/lib/qt3/include/qgrid.h"
    
    #include "unit.h"
    
    class MainWidget : public QVBox
    {
            public:
                    MainWidget (QWidget* parent= NULL, const char* name = NULL);
            private:
            protected:
    };
    
    MainWidget::MainWidget (QWidget* parent, const char* name) : QVBox (parent, name)
    {
    
            QPushButton* quit = new QPushButton ("Quit", this, "quit");
            quit->setFont (QFont ("Times", 18, QFont::Bold));
    
            connect (quit, SIGNAL (clicked ()), qApp, SLOT (quit ()));
    
            QGrid* grid = new QGrid (4, this);
    
            Container* previous = NULL;
            for (int r=0; r<4; r++)
            {
                    for (int c=0; c<4; c++)
                    {
                            Container* lr = new Container (grid);
                            if (previous)
                            {
                                    connect (lr, SIGNAL (valueChanged (int)), previous, SLOT (setValue (int)));
                                    previous = lr;
                            }
    
                    }
    
            }
    
    }
    
    int main (int argc, char** argv)
    {
    
            QApplication app (argc, argv);
    
            MainWidget w;
    
            app.setMainWidget (&w);
            w.show ();
    
            return app.exec ();
    
    }
    

    über eine zahlreiche resonanz würde ich mich freuen....



  • Die Warnungen/Fehlermeldungen wären noch interessant!



  • schabbac@venus:~/source/qt/meta> ./unit
    QObject::connect: No such slot QLCDNumber::dispay(int)
    QObject::connect: (sender name: 'slider')
    QObject::connect: (receiver name: 'lcd')
    QObject::connect: No such signal Container::valueChanged(int)
    QObject::connect: (sender name: 'slider')
    QObject::connect: (receiver name: 'unnamed')
    QObject::connect: No such slot QLCDNumber::dispay(int)
    QObject::connect: (sender name: 'slider')
    QObject::connect: (receiver name: 'lcd')
    QObject::connect: No such signal Container::valueChanged(int)
    QObject::connect: (sender name: 'slider')
    QObject::connect: (receiver name: 'unnamed')
    QObject::connect: No such slot QLCDNumber::dispay(int)
    QObject::connect: (sender name: 'slider')
    QObject::connect: (receiver name: 'lcd')
    QObject::connect: No such signal Container::valueChanged(int)
    QObject::connect: (sender name: 'slider')
    QObject::connect: (receiver name: 'unnamed')
    QObject::connect: No such slot QLCDNumber::dispay(int)
    QObject::connect: (sender name: 'slider')
    QObject::connect: (receiver name: 'lcd')
    QObject::connect: No such signal Container::valueChanged(int)
    QObject::connect: (sender name: 'slider')
    QObject::connect: (receiver name: 'unnamed')
    QObject::connect: No such slot QLCDNumber::dispay(int)
    QObject::connect: (sender name: 'slider')
    QObject::connect: (receiver name: 'lcd')
    QObject::connect: No such signal Container::valueChanged(int)
    QObject::connect: (sender name: 'slider')
    QObject::connect: (receiver name: 'unnamed')
    QObject::connect: No such slot QLCDNumber::dispay(int)
    QObject::connect: (sender name: 'slider')
    QObject::connect: (sender name: 'slider')
    QObject::connect: (receiver name: 'lcd')
    QObject::connect: No such signal Container::valueChanged(int)
    QObject::connect: (sender name: 'slider')
    QObject::connect: (receiver name: 'unnamed')
    QObject::connect: No such slot QLCDNumber::dispay(int)
    QObject::connect: (sender name: 'slider')
    QObject::connect: (receiver name: 'lcd')
    QObject::connect: No such signal Container::valueChanged(int)
    QObject::connect: (sender name: 'slider')
    QObject::connect: (receiver name: 'unnamed')
    QObject::connect: No such slot QLCDNumber::dispay(int)
    QObject::connect: (sender name: 'slider')
    QObject::connect: (receiver name: 'lcd')
    QObject::connect: No such signal Container::valueChanged(int)
    QObject::connect: (sender name: 'slider')
    QObject::connect: (receiver name: 'unnamed')
    QObject::connect: No such slot QLCDNumber::dispay(int)
    QObject::connect: (sender name: 'slider')
    QObject::connect: (receiver name: 'lcd')
    QObject::connect: No such signal Container::valueChanged(int)
    QObject::connect: (sender name: 'slider')
    QObject::connect: (receiver name: 'unnamed')
    QObject::connect: No such slot QLCDNumber::dispay(int)
    QObject::connect: (sender name: 'slider')
    QObject::connect: (receiver name: 'lcd')
    QObject::connect: No such signal Container::valueChanged(int)
    QObject::connect: (sender name: 'slider')
    QObject::connect: (receiver name: 'unnamed')

    so was kommt da.....



  • Die Meldungen sagen doch eigentlich alles oder?
    Es gibt kein QLCDNumber::dispay(int), dafür aber ein QLCDNumber::display(int)!

    Und ein Container::valueChanged(int) gibt es ebenfalls nicht, musst du also schon hinzufügen, wobei ich die Zeile:

    connect (slider, SIGNAL (valueChanged (int)), SIGNAL (valueChanged (int)));
    

    sowieso nicht verstehe!



  • oki. also das mit dem "disp(l)ay" ist mir ja klar.... naja und mit dem connect weiss ich auch nicht warum die im tutorial nen signal mit nem signal verknüpfen. wahrscheinlich nur um zu zeigen das das mit qt geht.... ich verstehe das ganze konzept eh noch nicht - das war auch eher der sinn dieses Threads.... vielleicht kann mir ja einer mal erklären was das alles soll mit den signalen und slots und connect und Q_OBJECT und so weiter und so fort.... und vor allem wozu man eigene signale braucht....



  • Hi,

    Sigmale brauchst du um ein Ereignis (z.B. den Klich auf einen Button) mit einem Slot zu verbinden. Slots werden mit

    public slots:
    
    //oder
    
    private slots:
    

    deklariert. Mit

    emit
    

    können sie #edit damit sind nathürlich die Signale gemeint# ausgelöst werden. Low-level-Ereignisse (z.B. eine Mausbewegung) werden durch reimpletierte virtual-Methoden impletiert. Dies solltest du dir vor Augen führen, da es fundamental für des Verständnis von Qt ist. Signale und Slots kannst du mit

    QObject::connect(...);
    

    verbinden.
    #edit 2: Q_Object ist ein Makro, dass bewirkt ,dass vor der Kompilation der Quelltext durch den moc-Compiller gejagt wird, und so Signals und Slots dem Compiler "bekannt gemacht werden.#


Anmelden zum Antworten