في كيو تي، كيف يمكنني استخدام فتحات Q_OBJECS وإشارات مع ميراث متعددة؟

StackOverflow https://stackoverflow.com/questions/1489238

  •  18-09-2019
  •  | 
  •  

سؤال

نظرت من خلال الأسئلة ذات الصلة، ولم أتمكن من العثور على أي شيء يتناول بالضبط ما كنت أتحدث عنه، لذلك اسمحوا لي أن أبو.

لدي فئة، دعنا نقول فو الذي يحتاج إلى أن يكون له فتحات وإشاراته الخاصة، ولكن تحتاج أيضا إلى الوراثة من QXMLDefaulthandler (يبدو غريبا، لكنني واجهت هذا الموقف عند محاولة استخدام QHTTP لقراءة موقع الويب مباشرة في Qbuffer مباشرة في Qbuffer مباشرة).

class foo: public QXmlDefaultHandler, public QObject
{
    public:
        foo();
        ~foo();

       Q_OBJECT
   public slots:
       void bar();
}

هذا الرمز، إذا كان مصحوبا ب CPP للاتصال بالشريط لإشارة مكان آخر، فلن يترجم. ستحصل على أخطاء حول بعض أعضاء QObject لا يجري عضوا في QXMLDefaulthandler. بالإضافة إلى ذلك، لا يمكنك نقل Q_Object أو يمكنك الحصول على أخطاء VTable لعدم تطبيق بعض الأشياء (استمر! جربه!).

يرجى الاطلاع على إجابتي للإصلاح (بسيط للغاية). سوف أستمتع بالتصويت كإجابة مقبولة إذا كنت أعتقد أنك توضح أنه أفضل مما أفعله.

تحرير: بالنسبة لك C ++ و CT البيطريات، يرجى نشر إجابة إذا كنت تستطيع شرح ذلك بشكل أفضل. قضيت وقتا طويلا في البحث عن هذه المعلومات، لذا يرجى مساعدة شخص آخر إذا كنت تستطيع أن تفعل أفضل مني.

هل كانت مفيدة؟

المحلول

ال وثائق ل moc. تنص على أنه في حالات الميراث المتعددة، يجب أن تظهر الفصل الذي يوفر QOOBJECT أولا

إذا كنت تستخدم ميراث متعددة، فافترض MOC أن الطبقة الموروثة الأولى هي فئة فرعية من QOOBJECT. أيضا، تأكد من أن الطبقة الموروثة الأولى فقط هي QOBJECT.

 // correct
 class SomeClass : public QObject, public OtherClass
 {
     ...
 };

الميراث الظاهري مع QOOBject غير مدعوم.

نصائح أخرى

class foo: public QObject, public QXmlDefaultHandler
{
    public:
        foo();
        ~foo();
   Q_OBJECT
   public slots:
       void bar();
}

بسيطة كما يبدو، إذا لم تضع QObject أولا في قائمة الميراث، فمن المستحيل هذه المهمة. إنها قيود في نظام كائنات تاا كيو تي. إذا لم تفعل ذلك، فسيحاول التحويل البرمجي تطبيق بعض أعضاء QOBject كجزء من QXMLDefaulThandler.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top