سؤال

أحاول جعل وظيفة مماثلة ل إمبولي (من ماتلاب) في كيو تي.الآن ، لدي فئة فرعية من كغرافيكسفيو وتعيين وظيفة افتراضية "دراوباكغروند" كما:

void roiwindow::drawBackground(QPainter *painter, const QRectF &rect)
{
painter->save();
painter->drawImage(rect, *refimage);
painter->restore();
}

هذا يعمل بشكل رائع وهو بالضبط ما أريده بقدر طبقة الخلفية.الآن ، أحاول إضافة دوائر تعمل في النهاية كعقد للمضلع.فعلت هذا باستخدام:

QGraphicsView *view = new QGraphicsView(this);
view->show();
QGraphicsEllipseItem *e1;
e1 = this->addEllipse(20, 20, 30, 30, QColor(0, 0, 0), Qt::white);
e1->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsMovable);

هذا هو نوع من ما أريد.ولكن ، هناك مشكلة أنه عندما انقر واسحب الحذف ، خلفية القطع الناقص هو نسخة مصغرة من * ريفيماج...هذا يترك نوعا من خط عبر الشاشة لكنه يختفي عند النقر على نافذة أخرى أو تصغير النافذة.هل كغرافيكسيتم أيضا استدعاء دراوباكغروند?إذا كان الأمر كذلك ، يبدو أنه يطلق عليه فقط عندما يتم سحب العنصر.أي اقتراحات لكيفية يمكنني رمز هذا أفضل?شكرا.

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

المحلول

الشرائط التي تحدث لأنك ربما يكون قغرافيكسفيو تعيين إلى الافتراضي وضع تحديث إطار العرض, ، وهو QGraphicsView::MinimalViewportUpdate.في هذه الحالة ، تحتاج إلى QGraphicsView::FullViewportUpdate.والسبب هو أنه عند نقل العناصر حولها ، يجب إعادة رسم الخلفية وراءها ، ولكن عندما يكون لديك MinimalViewportUpdate تعيين ، سيتم إعادة رسم العناصر فقط (ما لم يكن هناك تحديث إطار العرض الكامل ، على سبيل المثال ، من تصغير/تعظيم النافذة).

نصائح أخرى

QGraphicsView::drawBackground يسمى كلما شيء ما من عرض الرسومات يحتاج إلى إعادة رسم.هذا شيء ما قد يكون أصغر من العرض بأكمله للحصول على أداء أفضل.

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

في إعادة تنفيذ الخاص بك من drawBackground, ، أنت تقول:

painter->drawImage(rect, *refimage);

الذي يرسم في الواقع الصورة في وحجم المنطقة المراد تحديثها, ، وليس الحجم الإجمالي للعرض.

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

painter->drawImage(0, 0, *refimage);

أو يمكنك استخدام المنطقة بأكملها في المشهد:

painter->drawImage(sceneRect(), *refimage);

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

scene()->setSceneRect(0, 0, 800, 800);

انظر الوثائق: QGraphicsView::sceneRect و QGraphicsScene::sceneRect

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