باستخدام إشارات كيو تي وفتحات مع الميراث متعددة
-
16-09-2020 - |
سؤال
لدي فئة (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()));