2011-12-17 5 views
8

मैं क्यूटी के लिए बिल्कुल नया हूं। मैंने मौजूदा क्यूटी एप्लिकेशन में कुछ सरल संशोधन किए हैं, लेकिन मैंने अभी तक स्क्रैच से कोई भी नहीं बनाया है।
मुझे सामान्य रूप से सी ++ के कुछ पहलुओं (वर्ग विरासत इत्यादि) के साथ वास्तव में बहुत अधिक अनुभव नहीं है।क्यूटीमर :: सिंगलशॉट() दिए गए ऑब्जेक्ट के पैरेंट क्लास में निर्दिष्ट स्लॉट की तलाश करता है, न कि ऑब्जेक्ट स्वयं

मैंने एक नया कोड :: ब्लॉक Qt4- आधारित प्रोजेक्ट बनाया है और टेम्पलेट को थोड़ा सा संशोधित किया है। मैंने दो फाइलें जोड़ दी हैं।
अभी इस परियोजना में तीन फाइलें हैं: main.cpp, app.h और app.cpp।
यह main.cpp की सामग्री है:

#include <QTimer> 

#include "app.h" 

int main(int argc, char* argv[]) { 
    TestApp app(argc, argv); 

    QTimer::singleShot(1000, &app, SLOT(timeout())); 

    return app.exec(); 
} 

यह वही है app.h लग रहा है जैसे:

#ifndef APP_H_INCLUDED 
#define APP_H_INCLUDED 

#include <QApplication> 

class TestApp: public QApplication { 
    public: 
    TestApp(int &argc, char **argv); 
    public slots: 
    void timeout(); 
}; 

#endif 

और यह app.cpp है:

#include "app.h" 

#include <QDebug> 

TestApp::TestApp(int &argc, char **argv): QApplication(argc, argv) { 
} 

void TestApp::timeout() { 
    qDebug() << "timeout called"; 
} 

मुझे प्रोजेर की उम्मीद थी स्टार्टअप के बाद एक सेकंड "टाइमआउट" प्रिंट करने के लिए हूँ। दुर्भाग्य से, यह काम नहीं करता है। जब QTimer::singleShot() कहा जाता है, कंसोल का कहना है:

Object::connect: No such slot QApplication::timeout() in [path to the main.cpp file] 
Object::connect: (receiver name: 'QtTests') 

मैं पता नहीं कैसे इस से निपटने के लिए। पहले ही, आपका बहुत धन्यवाद।

उत्तर

6

आप बस अपनी TestApp कक्षा में Q_OBJECT मैक्रो छूट रहा है:

class TestApp: public QApplication { 
    Q_OBJECT 

    public: 
    ... 

यह आवश्यक है पूरे संकेत/स्लॉट बुनियादी सुविधाओं के लिए काम करने के लिए (और एक वर्ग इस मैक्रो है कि से पाने के लिए पर्याप्त नहीं है) ।

(आपको लगता है कि परिवर्तन के बाद एक पूर्ण, स्वच्छ निर्माण करना सुनिश्चित करें -। और अगर आप qmake या कुछ अन्य क्यूटी अवगत निर्माण प्रणाली का उपयोग नहीं करते हैं, तो आप अपने आप को moc चलाने की आवश्यकता होगी)

के लिए

सूचना है कि Q_OBJECT मैक्रो किसी भी वस्तु को लागू करने वाली संकेत, स्लॉट या गुण के लिए अनिवार्य है: संदर्भ, QObject दस्तावेज़ देख सकेंगे। आपको स्रोत फ़ाइल पर मेटा ऑब्जेक्ट कंपाइलर चलाने की भी आवश्यकता है। हम क्यूओबीजेक्ट के सभी उप-वर्गों में इस मैक्रो के उपयोग की दृढ़ता से अनुशंसा करते हैं कि वे वास्तव में संकेतों, स्लॉट्स और गुणों का उपयोग करते हैं या नहीं, क्योंकि ऐसा करने में विफलता अजीब व्यवहार को प्रदर्शित करने के लिए कुछ कार्यों का नेतृत्व कर सकती है।

3

आपको एक एमओसी फाइल बनाने की आवश्यकता है, जिसे qmake के साथ बनाया गया है यदि आप अपनी कक्षा में Q_OBJECT मैक्रो डालते हैं।

तो, अपने उदाहरण ठीक करने के लिए, आप अपने वर्ग इस के लिए बदल की जरूरत है:

class TestApp: public QApplication { 
    Q_OBJECT 
    public: 
    TestApp(int &argc, char **argv); 
    public slots: 
    void timeout(); 
}; 
+0

+1 * MOC फ़ाइल * उल्लेख के लिए! कक्षा घोषणा में 'Q_OBJECT' डालकर क्यूमेक नहीं कहा जाता है, उदाहरण के लिए जब सीएमके के साथ निर्माण होता है। – Melebius

+1

@Melebius इसके लिए, आपको 'QT4_WRAP_CPP' का उपयोग करने की आवश्यकता है, इसलिए सेमेक हेडर को पार्स करेगा, और एमओसी फाइलें उत्पन्न करेगा। –

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