2013-11-10 6 views
17

मैंने अन्य समान प्रश्नों की जांच की और उनके समाधानों की कोशिश की लेकिन वे मेरे लिए काम नहीं करते हैं।क्यूटी 5 कनेक्ट करें "ऐसा कोई स्लॉट नहीं" त्रुटि

मैं मूल रूप से एक http क्लाइंट बनाने की कोशिश कर रहा हूं जो केवल पोस्ट अनुरोध करता है। ऐसा करने के लिए, मुझे कुछ कॉलबैक स्लॉट पर QNetworkManager के समाप्त सिग्नल को कनेक्ट करने की आवश्यकता है।

मेरा कोड यहां है।

ज फ़ाइल:

... 
public slots: 
    void finishedSlot(QNetworkReply* reply); 
private: 
    QNetworkAccessManager *network_manager; 
... 

cpp फ़ाइल:

... 
Class1::Class1(){ 
    network_manager = new QNetworkAccessManager(this); 
    QObject::connect(network_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(finishedSlot(QNetworkReply *))); 
} 
... 
void Class1::finishedSlot(QNetworkReply* reply) 
{ 
    // some logic with reply 
} 
... 

आप देख सकते हैं, स्लॉट निश्चित रूप से मौजूद है और यह हेडर फाइल में सार्वजनिक स्लॉट्स के तहत घोषित किया जाता है। तो मुझे नहीं पता कि यह क्यों हो रहा है। मैंने पहले ही साफ, क्यूमेक चलाने और पुनर्निर्माण की कोशिश की है।

त्रुटि संदेश है "QObject :: कनेक्ट: ऐसी कोई स्लॉट QObject :: finishedSlot (QNetworkReply *)"

किसी भी विचार?

+2

ध्यान दें कि त्रुटि कहती है ** QObject ** :: समाप्त स्लॉट। इसका मतलब है कि क्यूटी को आपके उप-वर्ग के बारे में पता नहीं है। इसका मतलब है कि इसके बारे में मेटा जानकारी उत्पन्न नहीं हुई थी। इसका मतलब है कि आपकी कक्षा में 'moc' नहीं चलाया गया था। इसका मतलब है कि आपकी कक्षा में 'Q_OBJECT' मैक्रो की कमी है। – peppe

+0

आपको "स्लॉट्स:" क्षेत्र में अपना स्लॉट फ़ंक्शन (हेडर फ़ाइल में) निर्दिष्ट करना न भूलना चाहिए – peter70

उत्तर

37

आप शायद Q_OBJECT मैक्रो का उपयोग करना भूल गए हैं। प्रत्येक वर्ग जो अपने स्लॉट/संकेतों को लागू करता है उस मैक्रो की आवश्यकता होती है। यह न भूलें कि आपको अपनी हेडर/स्रोत फ़ाइल को .pro फ़ाइल में जोड़ना होगा।

+4

बहुत बहुत धन्यवाद। मुझे इसे जोड़ने के बाद भी/qmake/पुनर्निर्माण करना पड़ा। – Charlemagne

+0

@ चार्लेमैने: प्रोजेक्ट पर केवल दोबारा चलने वाला भूकंप पर्याप्त होगा, मुझे लगता है। यह बड़ी परियोजनाओं पर समय बचा सकता है। –

16

ध्यान देने योग्य एक बात; चूंकि आप क्यूटी 5 का उपयोग कर रहे हैं, वहां एक नया सिग्नल स्लॉट कनेक्शन सिंटैक्स है, जो आपको स्लॉट के रूप में परिभाषित किए गए कार्यों को निर्दिष्ट करने की अनुमति देगा।

इस स्थिति आप यह कर सकते हैं: -

connect(network_manager, &QNetworkAccessManager::finished, this, &Class1::finishedSlot); 

क्या महान इस वाक्य है कि आप बस इसलिए यदि आप उन्हें में बदल समारोह का पता निर्दिष्ट और मानकों के बारे में परेशान नहीं है, है के बारे में है एक समारोह, आपको कनेक्ट स्टेटमेंट में उन्हें अपडेट करने की आवश्यकता नहीं है।

हालांकि आपको अभी भी Q_OBJECT मैक्रो का उपयोग करना चाहिए और आप नए वाक्यविन्यास here के बारे में अधिक पढ़ सकते हैं।

+0

क्या आप हमें बता सकते हैं कि इस तरह के फ़ंक्शन को स्थैतिक घोषित किया जाना है? – igleyy

+1

फ़ंक्शन को स्थैतिक होने की आवश्यकता नहीं है, क्योंकि उदाहरण के लिए पॉइंटर कनेक्ट कॉल को पास किया जाता है। – TheDarkKnight

+0

Ouuuwww, तुम सही हो! 'कक्षा 1 :: समाप्त स्लॉट' से पहले हम 'यह' पास करते हैं। मैं बस अपने सभी क्यूटी अनुभव भूल गया :)। – igleyy

0

शायद आप Q_OBJECT मैक्रो का उपयोग करना भूल गए हैं। प्रत्येक वर्ग जो अपने स्लॉट/संकेतों को लागू करता है उस मैक्रो की आवश्यकता होती है। यह न भूलें कि आपको अपने हेडर/स्रोत फ़ाइल को .pro फ़ाइल में जोड़ना होगा।

के रूप में इन चरणों का मैं के बारे में कुछ त्रुटि हो रही थी निम्नलिखित "vtable नहीं बनाई गई है ..." संबंधित वर्ग के लिए और फिर मैं HEADERS += और SOURCES += के पदानुक्रम बदल गया है, के रूप में:

HEADERS +=\ 
SOURCES += 

ठीक है, समस्या हल हो गई है। लेकिन मुझे इसका कारण समझ में नहीं आया। कोई भी connect()Q_OBJECT, moc_*file के साथ *.pro फ़ाइलों (इन प्रो-फाइलें कैसे उत्पन्न होते हैं) के साथ इस संबंध को प्रबुद्ध करेगा।

मैं (SOURCES, HEADER, CONFIG, आदि), लेकिन यह मामला क्यों पदानुक्रम समस्या पैदा करेगा में समझ है कि यह प्रति टैग के रूप में *.pro को पार्स है था?

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