جعل QGraphicsscene أكبر عند وضع عنصر رسومي على حدوده

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

  •  26-09-2019
  •  | 
  •  

سؤال

لقد صنعت QGraphicsScene مع mouseClickEvent هذا يتيح للمستخدم إنشاء مربعات زرقاء بداخله. لكنني أريد أن أجعل المشهد ينمو عندما يتم وضع عنصر على حدوده حتى لا ينفد المستخدم أبدًا من المساحة على مشهد الرسومات.

ما هي أفضل طريقة لجعل مشهد رسومات أكبر في هذه الحالة؟

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

المحلول

أقترح فعل شيء مثل ما يلي:

  1. احصل على المستقيم المحبط لجميع العناصر في المشهد باستخدام QGraphicsScene::itemsBoundingRect().
  2. أضف بعض الحشو حول هذا المستقيم للتأكد من أن حدود العناصر لن تصل إلى حافة العرض. شيء مثل myRect.adjust(-20, -20, 20, 20) يجب أن تكون كافية.
  3. يستخدم QGraphicsView::fitInView(myRect, Qt::KeepAspectRatio) لضمان أن تكون المنطقة التي يتم أخذها ضمن الحدود المرئية للمنظر.

يجب أن تفعل ذلك. يجب استدعاء هذا الرمز كلما تغير شيء ما في المشهد. يمكنك استخدام وظيفة QRectf :: Intersects () لمعرفة ما إذا كان قد تم وضع المستقيم الجديد على حافة العرض.

ما هي أفضل طريقة لجعل مشهد رسومات أكبر في هذه الحالة؟

GraphicsScene هو نظام الإحداثيات اللانهائي. سوف يستخدم معظم العملاء itemsBoundingRect() للحصول على فكرة عن مقدار المساحة التي تستخدمها العناصر الموجودة بالفعل في المشهد. إذا قمت بمسح المشهد ، فقد ترغب في الاتصال QGraphicsScene::setSceneRect(QRectF()) "لجعلها أصغر" مرة أخرى.

امل ان يساعد.

نصائح أخرى

آسف إذا كان هذا متأخراً قليلاً (6 سنوات) ، لكنني سأقدم إجابة إذا كان شخص ما لا يزال يعاني من هذا أو يريد نهجًا آخر mouseReleaseEvent في الفئة المخصصة تستمد من QGraphicsObject. لاحظ أنني أقوم بتهيئة حجم بلدي QGraphicsScene (1000،1000) مع الكود التالي.scene->setSceneRect(0,0,1000,1000). إذن هنا ما سيفعله الرمز الخاص بي. إذا تم وضع العنصر (العنصر القابل للسحب) على الحدود ، فستزداد تلك الحدود. إذن ها هو رمزتي:

void MyItem::mouseReleaseEvent(QgraphicsceneMouseEvent* event){
  QRectF tempRect = this->scene()->sceneRect();
  if(this->scenePos().y() < this->scene()->sceneRect().top()){
      tempRect.adjust(0,-200,0,0);
      if(this->scenePos().x() < this->scene()->sceneRect().left()){
          tempRect.adjust(-200,0,0,0);
      }
      else if(this->scenePos().x() + 200> this->scene()->sceneRect().right()){
        tempRect.adjust(0,0,200,0);
      }
  }
  else if(this->scenePos().y() + 200 > this->scene()->sceneRect().bottom()){
      tempRect.adjust(0,0,0,200);
      if(this->scenePos().x() < this->scene()->sceneRect().left()){
          tempRect.adjust(-200,0,0,0);
     }
     else if(this->scenePos().x() + 200> this->scene()->sceneRect().right()){
        tempRect.adjust(0,0,200,0);
     }
 }
 else if(this->scenePos().x() < this->scene()->sceneRect().left()){
      tempRect.adjust(-200,0,0,0);
      if(this->scenePos().y() < this->scene()->sceneRect().top()){
          tempRect.adjust(0,-200,0,0);
      }
      else if(this->scenePos().y() + 200 > this->scene()->sceneRect().bottom()){
          tempRect.adjust(0,0,0,200);
      }
  }
  else if(this->scenePos().x() + 200> this->scene()->sceneRect().right()){
      tempRect.adjust(0,0,200,0);
      if(this->scenePos().y() < this->scene()->sceneRect().top()){
          tempRect.adjust(0,-200,0,0);
      }
      else if(this->scenePos().y() + 200 > this->scene()->sceneRect().bottom()){
          tempRect.adjust(0,0,0,200);
      }
  }

  this->scene()->setSceneRect(tempRect);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top