2013-05-24 11 views
5

Sam próbuję napisać program w Qt łączący funkcję z przyciskiem w Qt5.Przycisk połączenia z dowolną funkcją

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

Ale ja dostaję błędy jak main.cc:23:39: Błąd: W tym kontekście main.cc:23:55: błąd: Nieprawidłowe użycie void ekspresji Marka: [* main.o] błąd 1

Proszę o pomoc ...

+1

nie wiem zbyt wiele o qt 5, ale myślę, że trzeba usunąć parathesis w 'wkładki()' na ' wstaw ". – Jichao

+0

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). –

+0

Ponadto wątpię, czy zadziała to bez 'return app.exec()' na końcu funkcji 'main'. – Amartel

Odpowiedz

2

* 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.

+3

To jest złe. OP określił Qt5 i jest to możliwe. – UmNyobe

+0

@UmNyobe Dziękuję. Całkowicie przegapiłem, że chodziło o Qt5.0 –

8

W Qt 5 należy użyć nowego qt signal and slots system. Połączenie będzie wyglądać następująco:

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

To już zostało powiedziane, ale trzeba zadzwonić app.exec(); aby rozpocząć ich przetwarzanie w pętli zdarzenia. W przeciwnym razie połączenie nigdy nie zostanie wyzwolone.

Ponadto, jeśli jesteś w trybie zwolnienia następnie możesz nie widzieć wyjście qDebug()

+0

, który wyrzuca błąd 'spinBox: musi być klasą lub przestrzenią nazw, po której następuje ::' mimo, że używam Qt 5.4. – CroCo