मैंने इस विषय के लिए बहुत कुछ खोजा है और पहले से ही कुछ दृष्टिकोण पाया है लेकिन मुझे कुछ त्रुटियां मिलती हैं, मुझे इसका कारण नहीं मिल रहा है।

विचार बाद में एक combobox में तारों को भरने के लिए QMetaEnum के साथ enum से चाबियाँ पढ़ना है।

मेरे पास पहले से ही एनम है और उस कक्षा में Q_Object और Q_Enum मैक्रो भी सेटअप है जहां एनम है। लेकिन मुझे QMetaEnum का उपयोग करके "प्लैनेट :: मेटाऑब्जेक्ट () कॉन्स्ट" के लिए अपरिभाषित संदर्भ "त्रुटि संदेश मिल रहा है।

यहाँ ग्रह है

#include <QMetaEnum>
class Planet
{
    Q_OBJECT
public:    
    enum PlanetTypes
    {
       Barren,Gas,Ice,Lava,Oceanic,Plasma,Storm,Temperate
    };Q_ENUM(PlanetTypes)
    Planet();
    //some getters and setters for my private member-variables
};

यहां स्निप किया गया है जहां मैं एनम को पढ़ने और त्रुटि संदेश प्राप्त करने का प्रयास करता हूं।

QStringList DataModel::getPlanetTypes()
{
   QStringList PlanetTypesList;

   Planet p;
   const QMetaObject* metaObj = p.metaObject();
   QMetaEnum e = metaObj->enumerator(metaObj->indexOfEnumerator("PlanetTypes"));
   for(int i=0; i<e.keyCount();i++)
   {
        PlanetTypesList.append(e.key(i));
   }
   return PlanetTypesList;

}

त्रुटि रेखा को संदर्भित करती है:

QMetaEnum e = metaObj->enumerator(metaObj->indexOfEnumerator("PlanetTypes"));

मैंने QObject से ग्रह को विरासत में लेने की भी कोशिश की, लेकिन इसने इस मुद्दे को भी हल नहीं किया।

कुछ मदद पाने के लिए वास्तव में अच्छा होगा और शायद QMetaEnum उपयोग के कुछ और स्पष्टीकरण।

संपादित करें: यह मुझे यह कहते हुए एक त्रुटि भी देता है: 'ग्रह के लिए vtable' के लिए अपरिभाषित संदर्भ अगर यह किसी भी तरह से यह विचार करने में मदद करता है कि यह समस्या कहां से आती है।

संपादित करें2: मैंने इसे 'vtable' समस्या के लिए पाया है लेकिन यह इस त्रुटि को भी हल नहीं करता है। Qt vtable का अपरिभाषित संदर्भ

0
Rolf Hausen 11 जून 2021, 12:49

3 जवाब

सबसे बढ़िया उत्तर

मुझे मेरे प्रश्न का उत्तर मिल गया।

जैसा कि मैं इस व्यवहार्य मुद्दे के बारे में शोध कर रहा था, मुझे यह पोस्ट मिला है। C++ - `vtable का अपरिभाषित संदर्भ

और मैंने इसे एक शॉट दिया है और कक्षा से Q_Object मैक्रो को हटा दिया है। तब दोनों त्रुटियाँ गायब हो जाती हैं

संपादित करें: यह इसे हल नहीं करता है! लेकिन आप यहां समाधान ढूंढ सकते हैं: जैसा कि मैंने दूसरी पोस्ट की है उन्हें पता नहीं था कि दोनों मुद्दे एक दूसरे से जुड़े हुए हैं।

0
Rolf Hausen 13 जून 2021, 15:40

QMetaEnum सहित और QObject से प्राप्त करना आमतौर पर चाल करता है:

#include <QMetaEnum>
class Planet : public QObject
    {
        Q_OBJECT
    public: 

बाकी सब ठीक लग रहा है (पहली नज़र में)।

0
Jens 11 जून 2021, 19:05

इसके लिए केवल दो संभावित स्पष्टीकरण हैं:

  1. moc उपयोगिता को किसी भी कारण से Planet युक्त आपकी हेडर फ़ाइल को संसाधित करने के लिए नहीं बुलाया जाता है (खराब टाइमस्टैम्प जो इसे दूसरी बार निष्पादित होने से रोकता है और moc_planet.h का पुराना संस्करण है, फ़ाइल नहीं जोड़ी गई है प्रोजेक्ट करने के लिए और मेकफ़ाइल नियमों में नहीं है, हेडर का डुप्लिकेट है)

  2. Planet वर्ग के लिए कंपाइलर ऑप्टिमाइज़-आउट खाली vtable। इस मामले में कोई भी वर्चुअल फ़ंक्शन जिसे इनलाइन घोषित नहीं किया गया है, उदा। ~Planet(); .cpp में परिभाषित शरीर के साथ, करेगा।

0
Swift - Friday Pie 12 जून 2021, 21:55