2013-05-24 8 views
6

Sono consapevole del fatto che per utilizzare il meccanismo di Qt all'interno di una classe, la classe deve includere la macro Q_OBJECT, ma sto tentando di utilizzare segnali e slot in main() , senza usare alcuna classe.Impossibile connettersi a una funzione interna main()

Ecco il mio codice finora:

#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); 
} 

Ecco la finestra GUI generato:

GUI window

Dal codice di cui sopra, il pulsante di uscita è collegato a quit(), che è un Funzione Qt, quando cliccato funziona. Il pulsante di salvataggio assegnato alla funzione saveText(), è configurato per uscire, ma non lo fa.

Per favore dimmi dove ho sbagliato nella comprensione dei segnali e degli slot in Qt.

risposta

7

Qt4 ...

Tutte le classi che ereditano da QObject o una delle sue sottoclassi (per esempio, QWidget) può contenere segnali e slot. 1

Quindi, non si può uso slot dove posto al di fuori della QObject bambini.

È possibile collegare i segnali agli slot che si trovano nelle classi derivate da QObject. Metti la tua fessura in una classe che si trova in un separato/ file di .h cpp:

class MyClass : public QObject 
{ 
    Q_OBJECT 

    ... 

    public slots: 
    void saveText(); 

}; 

Secondo QT5: New Signal Slot Syntax in Qt 5. È possibile connettersi a quel tipo di funzioni globali. (Grazie ai commenti di @ thuga)

+0

Perché, dunque, pulsante di uscita funziona? La funzione 'quit()' all'interno di una classe che eredita da QObject? – CodeCrusader

+0

'quit()' è uno slot all'interno di 'qApp' e' qApp' è un oggetto derivato da 'QObject'. – deepmax

+0

Ok, ora è chiaro .. – CodeCrusader

2

Metto solo un esempio qui.

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); 
}