* zobaczyć edycja poniżej
Przede wszystkim nie można podłącz sygnał do funkcji, powinieneś podłączyć go do slotu jakiejś klasy, a instancja tej klasy powinna być również dostarczona do QObject::connect
.
Więc pierwszą rzeczą do zrobienia jest zdefiniowanie klasy ze szczeliną:
// 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
Zauważ, że ta klasa musi dziedziczyć z QObject
i mieć Q_OBJECT
słowa kluczowego wewnątrz niego. Tę deklarację klasy należy umieścić w pliku *.h
(nie można mieć plików Q_OBJECT
w *.cpp
, ponieważ Qt ich nie zobaczy).
Teraz, że masz klasę z gniazda, można użyć QObject::connect
, właściwym sposobem byłoby:
QObject::connect(button, SIGNAL(clicked()), &c, SLOT(insert()));
Należy pamiętać, że trzeba użyć SIGNAL()
makr dla sygnałów i SLOT()
makr do szczelin po podłączeniu im.
Więc kod w main.cpp
powinna być następująca:
#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();
}
widzisz jak ja zapewnić instancję obiektu odbiornika (&c
) do connect()
funkcji, trzeba to zrobić nawet wtedy, gdy funkcja jest static
.
I na koniec musisz mieć app.exec();
, ponieważ w przeciwnym razie twój program nie będzie miał pętli komunikatów.
EDIT:
brakowało mi, że pytanie było o Qt 5. Dla Qt 5.0 odpowiedź jest błędna.
nie wiem zbyt wiele o qt 5, ale myślę, że trzeba usunąć parathesis w 'wkładki()' na ' wstaw ". – Jichao
Nie wiem o Qt, ale twoje wywołanie funkcji 'QObject :: connect' nie odpowiada podanemu prototypowi [Qt] (http://qt-project.org/doc/qt-4.8/qobject.html). –
Ponadto wątpię, czy zadziała to bez 'return app.exec()' na końcu funkcji 'main'. – Amartel