سؤال

أرسم المضلعات باستخدام إطار عرض الرسومات. أضفت مضلعًا إلى المشهد بهذا:

QGraphicsPolygonItem *poly = scene->addPolygon(QPolygonF(vector_of_QPointF));
poly->setPos(some_point);

لكنني بحاجة إلى تنفيذ بعض السلوك المخصص مثل الاختيار ، والماوس فوق المؤشر ، وغيرها من الأشياء المماثلة على عنصر الرسومات. لذلك أعلنت فئة ترث QGraphicspolyGonitem:

#include <QGraphicsPolygonItem>

class GridHex : public QGraphicsPolygonItem
{
public:
    GridHex(QGraphicsItem* parent = 0);
};

GridHex::GridHex(QGraphicsItem* parent) : QGraphicsPolygonItem(parent)
{
}

لا تفعل الكثير مع هذا الفصل حتى الآن ، كما ترون. ولكن ألا ينبغي استبدال QGraphicspolygonitem بعملي من فئة الشبكة؟ هذا هو إلقاء "تحويل غير صالح من" QGraphicspolyGonitem*"إلى" Gridhex*"" خطأ:

GridHex* poly = scene->addPolygon(QPolygonF(vector_of_QPointF));

ما الخطأ الذي افعله؟

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

المحلول

أنا أظن مشهد-> addpolygon يعيد QGraphicspolygonitem ، وهي فئة أساسية من تخصصك. ستحتاج إلى عمل ديناميكي حيث يمكنك فقط إجراء التحويل بأمان من خلال الصعود إلى التسلسلات الوحيدة بدلاً من الانخفاض.

GridHex* poly = dynamic_cast<GridHex*>(scene->addPolygon(QPolygonF(vector_of_QPointF)));
if (poly != NULL) {
    // You have a gridhex!
}

تعديل: على الرغم من أن إجابتي تساعد في مشكلة التحويل الخاصة بك ، كيف يمكنك ضمان أن المشهد يقوم بإنشاء كائنات الشبكة الخاصة بك؟ هل تخطط لتصنيف كائن المشهد أيضًا لإرجاع كائنات الشبكة الخاصة بك؟

ستتخطى الفئة الفرعية QGraphicsScene الخاصة بك addpolygon لفعل شيء مثل:

// Call the base class
QGraphicsPolygonItem* result = QGraphicsScene::addPolygon(vectorOfPoints);
// Return your stuff
return new GridHex(result);

نصائح أخرى

بشكل عام ، ليست فكرة جيدة لمؤشر فئة مشتقة لتوجيه الوالد ، بسبب "التقطيع". أقترح عليك القيام بذلك بدلاً من ذلك

GridHex* hex = new GridHex(scene);
scene->addItem(hex);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top