2013-05-24 11 views
6

Ich bin mir bewusst, dass die Klasse den Q_OBJECT Makro verwenden muss, um die Signale und Slots-Mechanismus von Qt innerhalb einer Klasse zu verwenden, aber ich versuche, Signale und Steckplätze in main() zu verwenden , ohne irgendeine Klasse zu benutzen. bisherKonnte kein Signal an eine Funktion in main() anschließen

Hier ist mein Code:

#include <QApplication> 
#include <QWidget> 
#include <QTextEdit> 
#include <QtGui> 

void saveText(); 

int main(int argv, char **args) 
{ 
    QApplication app(argv, args); 
    QTextEdit textEdit; 
    QPushButton saveButton("Save!"); 
    QPushButton exitButton("Exit!"); 
    QObject::connect(&exitButton,SIGNAL(clicked()),qApp,SLOT(quit())); 
    QObject::connect(&saveButton,SIGNAL(clicked()),qApp,SLOT(saveText())); 

    QVBoxLayout vlyt; 
    vlyt.addWidget(&textEdit); 
    vlyt.addWidget(&exitButton); 
    vlyt.addWidget(&saveButton); 

    QWidget mainWindow; 
    mainWindow.setLayout(&vlyt); 
    mainWindow.show(); 

    return app.exec(); 
} 

void saveText() 
{ 
    exit(0); 
} 

Hier sind die GUI-Fenster erzeugt:

GUI window

Aus dem obigen Code wird die Exit-Taste, um quit() verbunden, die eine ist Qt-Funktion, wenn geklickt wird, funktioniert es. Die Speichern-Schaltfläche, die der Funktion saveText() zugewiesen ist, ist zum Beenden konfiguriert, tut dies jedoch nicht.

Bitte sagen Sie mir, wo ich beim Verständnis von Signalen und Slots in Qt falsch gelaufen bin.

Antwort

7

Qt4 ...

Alle Klassen, die von QObject oder einer ihrer Unterklassen erben (z.B. QWidget) können Signale und Schlitze enthalten. 1

Also, Sie kann nicht Verwendung Schlitze, wo außerhalb der QObject Kinder gelegt.

Sie können Signale an die Steckplätze anschließen, die in Klassen von QObject abgeleitet sind. Setzen Sie Ihren Schlitz in einer Klasse, die in einer getrennten ist .h/CPP Datei:

class MyClass : public QObject 
{ 
    Q_OBJECT 

    ... 

    public slots: 
    void saveText(); 

}; 

Nach QT5: New Signal Slot Syntax in Qt 5. Sie können eine Verbindung mit diesen globalen Funktionen herstellen. (Dank @ Thuga Kommentare)

+0

Warum arbeitet Exit-Taste? Ist die 'quit()' Funktion innerhalb einer Klasse, die von QObject erbt? – CodeCrusader

+0

'quit()' ist ein Slot innerhalb 'qApp' und' qApp' ist ein Objekt, das von 'QObject' abgeleitet ist. – deepmax

+0

Ok, jetzt ist es klar .. – CodeCrusader

2

Ich werde nur Beispiel hier.

main.cpp:

#include <QCoreApplication> 
#include <iostream> 
#include <QObject> 
#include "siggen.h" 

void handler(int val){ 
    std::cout << "got signal: " << val << std::endl; 
} 

int main(int argc, char *argv[]) 
{ 
    SigGen siggen; 
    QObject::connect(&siggen, &SigGen::sgAction, handler); 
    siggen.action(); 

    QCoreApplication a(argc, argv); 
    std::cout << "main prog start" << std::endl; 

    return a.exec(); 
} 

siggen.h:

#ifndef SIGGEN_H 
#define SIGGEN_H 

#include <QObject> 

class SigGen : public QObject 
{ 
    Q_OBJECT 

public: 
    explicit SigGen(QObject *parent = 0); 
    void action(void); 

signals: 
    void sgAction(int value); 
}; 

#endif // SIGGEN_H 

siggen.cpp:

#include "siggen.h" 

SigGen::SigGen(QObject *parent) : QObject(parent) 
{} 

void SigGen::action() 
{ 
    emit sgAction(42); 
}