2013-05-24 7 views
5

Sto tentando di scrivere un programma in Qt collegando una funzione a un pulsante in Qt5.Pulsante di connessione a una funzione arbitraria

#include <QApplication> 
#include <QtGui> 
#include <QPushButton> 
static void insert() 
{ 
    qDebug() << “pressed”; 
} 

int main(int argc,char *argv[]) 
{ 
    QApplication app(argc,argv); 
    QPushButton *button=new QPushButton(“button”); 
    button->setGeometry(50,100,150,80); 
    QObject::connect(button,&QPushButton::clicked,insert()); 
    button->show(); 
    } 

Ma io sono sempre errori come main.cc:23:39: errore: in questo contesto main.cc:23:55: errore: utilizzo non valido di espressione vuoto marca: * [ main.o] Error 1

Aiutateci ...

+1

io non so molto di qt 5, ma penso che è necessario rimuovere il parathesis in 'inserto()' a ' insert'. – Jichao

+0

Non so di Qt ma la tua chiamata di funzione 'QObject :: connect' non corrisponde al prototipo dato qui [Qt] (http://qt-project.org/doc/qt-4.8/qobject.html). –

+0

Inoltre, dubito che funzionerà senza 'return app.exec()' alla fine della funzione 'main'. – Amartel

risposta

2

* vedere modifica sotto

Prima di tutto, non si può collegare un segnale a una funzione, dovresti connetterlo a uno slot di qualche classe, e un'istanza di questa classe dovrebbe essere fornita anche a QObject::connect.

Quindi la prima cosa da fare è quello di definire una classe con uno slot:

// file 'C.h' 
#ifndef __C_H__ 
#define __C_H__ 

#include <QtGui> 

class C : public QObject{ 
    Q_OBJECT 

public slots: 
    static void insert() 
    { 
     qDebug() << "pressed"; 
    } 
}; 

#endif 

Si noti che questa classe deve ereditare da QObject e di avere Q_OBJECT parola chiave al suo interno. Devi inserire questa dichiarazione di classe in un file *.h (non puoi avere Q_OBJECT nei file *.cpp perché Qt non lo vedrà).

Ora che avete una classe con uno slot, è possibile utilizzare QObject::connect, il modo corretto sarebbe:

QObject::connect(button, SIGNAL(clicked()), &c, SLOT(insert())); 

Si noti che è necessario utilizzare SIGNAL() macro per segnali e SLOT() macro per gli slot al momento della connessione loro.

Così il codice in main.cpp dovrebbe essere la seguente:

#include "C.h" 

    int main(int argc,char *argv[]) 
    { 

     QApplication app(argc,argv); 
     QPushButton *button=new QPushButton("button"); 
     button->setGeometry(50,100,150,80); 
     C c; 
     QObject::connect(button, SIGNAL(clicked()), &c, SLOT(insert())); 
     button->show(); 

     return app.exec(); 
    } 

Vedete come fornisco un'istanza di un oggetto ricevitore (&c) per connect() funzione, è necessario farlo anche se la funzione è static .

E infine è necessario app.exec(); perché altrimenti il ​​programma non avrà un ciclo di messaggi.

EDIT:

mi mancava che la questione era di circa Qt 5. Per Qt 5.0 la risposta è sbagliata.

+3

Questo è sbagliato. L'OP ha specificato Qt5 ed è possibile. – UmNyobe

+0

@UmNyobe Grazie. Ho perso totalmente il fatto che si trattasse di Qt5.0 –

8

In Qt 5, è necessario utilizzare il nuovo qt signal and slots system. La connessione sarà simile:

QObject::connect(button,&QPushButton::clicked,insert); <-- no parentheses. 

Si è già detto, ma è necessario chiamare app.exec(); per avviare l'elaborazione ciclo di eventi. Altrimenti la connessione non verrà mai attivata.

Inoltre, se si è in modalità di rilascio, allora non si può vedere l'uscita del qDebug()

+0

che genera un errore 'spinBox: deve essere una classe o un namespace seguito da ::' anche se sto usando Qt 5.4. – CroCo

Problemi correlati