سؤال

لدي فئة (MyClass) أن يرث معظم وظائفه من كيو تي المدمج في الكائن (QGraphicsTextItem). QGraphicsTextItem يرث بشكل غير مباشر من QObject. MyClass تنفذ أيضا واجهة, MyInterface.

class MyClass : public QGraphicsTextItem, public MyInterface

أنا بحاجة إلى أن تكون قادرة على استخدام connect و disconnect على MyInterface*.ولكن يبدو أن connect و disconnect العمل فقط على QObject* حالات.منذ كيو تي لا يدعم الميراث متعددة من الطبقات المشتقة كوبجيكت ، لا أستطيع اشتقاق MyInterface من عند QObject.(ولن يكون ذلك منطقيا بالنسبة للواجهة على أي حال.)

هناك مناقشة المشكلة عبر الإنترنت, ، ولكن المنظمة البحرية الدولية الحل المقترح غير مجدية إلى حد ما في حالة مشتركة (الوصول إلى كائن من خلال واجهة) ، لأنه لا يمكنك توصيل الإشارات وفتحات من MyInterface* ولكن يجب أن يلقي بها إلى نوع المشتقة.منذ MyClass هي واحدة من العديد MyInterface- الطبقات المشتقة، وهذا من شأنه أن يتطلب" رمز رائحة كريهة " إذا كان هذا يلقي إلى هذا آخر إذا كان هذا يلقي إلى أن البيانات ويهزم الغرض من واجهة.

هل هناك حل جيد لهذا القيد?

تحديث: لقد لاحظت أنه إذا كنت dynamic_cast a MyInterface* إلى QObject* (لأنني تعرف الكل MyInterface- الطبقات المشتقة ترث أيضا في نهاية المطاف من QObject, ، يبدو أنه يعمل.هذا هو:

MyInterface *my_interface_instance = GetInstance();
connect(dynamic_cast<QObject*>(my_interface_instance), SIGNAL(MyInterfaceSignal()), this, SLOT(TempSlot()));

لكن هذا حقا يبدو أنني أطلب سلوكا غير محدد....

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

المحلول

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

أود أيضا أن أقدم بعض الاقتراحات الأخرى:

  • استخدام س_واجهات ميزة (انها ليست فقط للمكونات الإضافية).ثم كنت تعمل من حيث كوبجيكت والاستعلام عن مينتيرفاس باستخدام كوبجيكت_كاست عندما يكون هناك حاجة حقا.أنا لا أعرف مشكلتك بالتفصيل ، ولكن بما أنك تعرف أن جميع حالات مينتيرفاس هي أيضا كوبجيكتس ، وهذا يبدو أن النهج الأكثر منطقية.

  • إضافة QObject* asQObject() طريقة مجردة إلى مينتيرفاس وتنفيذها على النحو التالي { return this; } في جميع الفئات الفرعية.

  • وجود أ قغرافيكستستيتم (تكوين) بدلا من يجري واحد (الميراث).

نصائح أخرى

يمكنك أن تعلن مينتيرفاس الذي يأخذ كوبجيكت في منشئ لها:

class MyInterface {
public:
                MyInterface(QObject * object);
    QObject *   object() { return m_object; }
    ...
private:
    QObject *   m_object;
};

MyInterface::MyInterface(QObject * object) :
    m_object(object)
{
    ...
}

ثم في ميكلاس منشئ:

MyClass::MyClass() :
MyInterface(this)
{
    ...
}

ويمكنك توصيل الإشارة:

MyInterface *my_interface_instance = GetInstance();
connect(my_interface_instance->object(), SIGNAL(MyInterfaceSignal()), this, SLOT(TempSlot()));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top