* 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.
io non so molto di qt 5, ma penso che è necessario rimuovere il parathesis in 'inserto()' a ' insert'. – Jichao
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). –
Inoltre, dubito che funzionerà senza 'return app.exec()' alla fine della funzione 'main'. – Amartel