2013-05-24 9 views
5

मैं Qt5 में एक बटन को फ़ंक्शन को जोड़ने वाले क्यूटी में एक प्रोग्राम लिखने की कोशिश कर रहा हूं। त्रुटि:एक मनमाने ढंग से कार्य करने के लिए कनेक्टिंग बटन

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

लेकिन मैं main.cc:23:39 तरह त्रुटियों हो रही है इस संदर्भ में main.cc:23:55: त्रुटि: * [: शून्य अभिव्यक्ति मेकअप के अवैध उपयोग main.o] त्रुटि 1

कृपया मदद ...

+1

के उत्पादन में मैं क्यूटी 5 के बारे में ज्यादा पता नहीं है देख सकते हैं, लेकिन मैं आप() 'को' 'डालने में parathesis दूर करने के लिए की जरूरत है insert'। – Jichao

+0

मुझे क्यूटी के बारे में पता नहीं है लेकिन आपका फ़ंक्शन कॉल 'QObject :: कनेक्ट' यहां दिए गए प्रोटोटाइप से मेल नहीं खाता है [Qt] (http://qt-project.org/doc/qt-4.8/qobject.html)। –

+0

इसके अलावा, मुझे संदेह है कि यह 'मुख्य' फ़ंक्शन के अंत में 'return app.exec()' के बिना काम करेगा। – Amartel

उत्तर

2

* नीचे देखें

सबसे पहले संपादित करें आप नहीं कर सकते किसी फ़ंक्शन पर सिग्नल कनेक्ट करें, आपको इसे किसी वर्ग के स्लॉट से कनेक्ट करना चाहिए, और इस वर्ग का एक उदाहरण QObject::connect पर भी प्रदान किया जाना चाहिए।

तो ऐसा करने के लिए पहली बात एक स्लॉट के साथ एक वर्ग को परिभाषित करने के लिए है:

// 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 

नोट इस वर्ग QObject से प्राप्त करना और Q_OBJECT कीवर्ड इसके अंदर है करने के लिए है। आपको *.h फ़ाइल में इस कक्षा की घोषणा करना है (की *.cpp फाइलों में नहीं है क्योंकि क्यूटी इसे नहीं देख पाएगी)।

अब जबकि आपने एक स्लॉट के साथ एक वर्ग है, तो आप QObject::connect उपयोग कर सकते हैं, उचित तरीके से होगा:

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

नोट जब आप कनेक्ट स्लॉट के लिए संकेतों के लिए SIGNAL() मैक्रो और SLOT() मैक्रो का उपयोग करने के लिए है कि उन्हें।

तो main.cpp में कोड इस प्रकार होना चाहिए:

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

आप देखते हैं कि कैसे मैं एक रिसीवर वस्तु (&c) connect() कार्य करने के लिए का एक उदाहरण प्रदान करते हैं, तो आप अपने समारोह static, भले ही वह क्या करना है ।

और अंत में आपको app.exec(); होना चाहिए क्योंकि अन्यथा आपके प्रोग्राम में संदेश लूप नहीं होगा।

संपादित करें:

मैं याद किया है कि प्रश्न क्यूटी 5.0 के लिए क्यूटी 5. के बारे में था जवाब गलत है।

+3

यह गलत है। ओपी निर्दिष्ट Qt5, और यह संभव है। – UmNyobe

+0

@UmNyobe धन्यवाद। मुझे पूरी तरह से याद आया कि यह Qt5.0 –

8

क्यूटी 5 में, आपको नए qt signal and slots system का उपयोग करने की आवश्यकता है। कनेक्शन दिखेगा की तरह:

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

यह पहले से ही कहा गया है, लेकिन आप app.exec(); कॉल करने के लिए घटना पाश प्रसंस्करण शुरू करने के लिए की जरूरत है। अन्यथा कनेक्शन कभी ट्रिगर नहीं किया जाएगा।

इसके अलावा, अगर आप को रिलीज़ मोड पर हैं तो आप नहीं qDebug()

+0

के बारे में था, यह एक त्रुटि को फेंकता है 'स्पिनबॉक्स: इसके बाद कक्षा या नामस्थान होना चाहिए:' हालांकि मैं Qt 5.4 का उपयोग कर रहा हूं। – CroCo

संबंधित मुद्दे