# QT4 Slots anlegen und verbinden



## jojomp (7. Dezember 2007)

Hallo,

hab gerade die Suche angeworfen ("QT4 slots") und bin auf einen Thread ohne Antworten gestoßen, der genau dieses Problem behandelt.
Ich hab mir das Interface mit dem Designer angelegt und möchte den Rest von Hand machen. Da es ein Taschenrechner werden soll, möchte ich die Zahlentasten mit einer input()-Funktion verbinden, die dann auf einem lineEdit den Kram ausgibt, und intern außerdem die Zahl ergänzt, um später damit rechnen zu können.
Nun das Problem: Wie kann ich eigene Slots anlegen?

Hier mal die gekürzte ui_rechner.h:

```
class Ui_window : public QDialog // das public QDialog hab ich hinzugefügt
{


// mein Versuch
private slots:
    void input(/*int value*/) {
	printf("INPUT!\n");
	//lineEdit->setText(lineEdit->displayText() + value);
    }
    void calc_wurzel() {
	
    } // calc_wurzel
public:
    QWidget *widget;
    //......
    QPushButton *zahl_1;

    QPushButton *close;
    QLineEdit *lineEdit;

    MAPM calc_zahl1,calc_zahl2;
    void setupUi(QDialog *window)
    {
    //....
    //das ist noch vom Designer
    QObject::connect(close, SIGNAL(clicked()), window, SLOT(close()));
    //hier hab ich versucht zu verbinden
    QObject::connect(zahl_1, SIGNAL(clicked()), window, SLOT(input()));
    QMetaObject::connectSlotsByName(window);
    } // setupUi

    void retranslateUi(QDialog *window)
    {
    // ....
    } // retranslateUi
};

namespace Ui {
    class window: public Ui_window {};
} // namespace Ui
```

Was mache ich falsch? Bzw. in welche Datei/Klasse muss ich die Slots schreiben?

Gruß
jojomp

Achja, auf der Konsole wird ausgegeben:

Object::connect: No such slot QDialog::input()
Object::connect:  (sender name:   'zahl_1')
Object::connect:  (receiver name: 'window')


----------



## RedWing (7. Dezember 2007)

Hallo,

du musst deine slots Qt's MOS (Meta Object System) bekannt machen. Dazu musst du innerhalb deiner Klasse das Makro Q_OBJECT deklarieren und dann Qt's meta-object compiler über den source laufen lassen. Die Datei die dabei hinten ausgespuckt wird musst du entweder in den Source mit inkludieren oder mit zum Programm hinzulinken...

Gruß,
RedWing


----------



## RedWing (7. Dezember 2007)

Schau mal da:


```
#include <QObject>

class Foo : public QObject {
    Q_OBJECT

    public:
        Foo(QObject *parent = 0) : QObject(parent) {
            QObject::connect(this, SIGNAL(my_signal()), this, SLOT(my_slot()));
        }

        void fire_event() {
            emit my_signal();
        }

    public slots:
        void my_slot() {
            qDebug("Executing slot my_slot()");
        }

    signals:
        void my_signal();
};

int main(int argc, char **argv) {
    Foo f;
    // since the receiver object lives in the same thread as
    // the sender object, events are emitted in a synchronous way,
    // so we don't need Qt's event loop for this example
    f.fire_event();
}

// include the file that is generated by the moc
#include "qttest.moc"
```


----------



## jojomp (8. Dezember 2007)

Hallo RedWing,

vielen Dank für deine Hilfe. Jetzt hab ich allerdings ein Problem: Wie im Beispiel hab ich den Header eingebunden, der Klasse QObject vererbt und das Makro eingebaut:


```
// Ausschnitt aus ui_rechner.h
#include <QObject>

class Ui_window : public QObject
{
Q_OBJECT
public:
    QWidget *widget;
    QVBoxLayout *vboxLayout;
    QHBoxLayout *hboxLayout;
   //...
}
```
Dann hab ich
 - "qmake -project"
 - "qmake"
 - "make"

aufgerufen. Trotzdem befindet sich keine .moc Datei im Ordner und make spuckt Fehler aus, die auf eine fehlende Lib hindeuten.
Also 2 Fragen:
- muss ich eine Extra-Datei anlegen, in der ich meine Klasse ergänze und darauf irgendein Kommando loslasse (qmake vielleicht?)
- welche Lib muss ich einbinden?

Gruß jojomp


----------



## jojomp (8. Dezember 2007)

Sorry für den Doppelpost, habe gerade die Lösung gefunden:
Nachdem man mit QObject::connect() die Signale mit den Slots verbunden hat,
lässt man das Kommando "moc ui_rechner.h -o rechner.moc" auf die Datei los, dieses generiert die Datei rechner.moc, welche dann einfach per #include eingebunden wird. Dann noch mit make das Projekt erstellen und fertig. Nochmal vielen Dank für die Hilfe 

Gruß jojomp


----------



## RedWing (8. Dezember 2007)

Hallo,


jojomp hat gesagt.:


> [...]
> Nachdem man mit QObject::connect() die Signale mit den Slots verbunden hat,
> lässt man das Kommando "moc ui_rechner.h -o rechner.moc" [...]



Hätt ich vlt. dazu schreiben sollen, sorry für die fehlende Info. Passiert mir beim nächsten mal nicht wieder 

Gruß,
RedWing


----------

