الحصول على مستطيل مرئي من QGraphicsView؟
-
20-09-2019 - |
سؤال
لقد تم سحب شعري مع هذا لساعات. هناك موضوع هنا حول هذا الموضوع ، ولكن لا شيء يبدو أنه يعمل. QGraphicsView :: rect () سوف يعيد العرض والارتفاع ، ولكن left
و top
لا يتم تعيين القيم بشكل صحيح (دائمًا 0 - تجاهل المبلغ الذي تم تمريره). أريده في إحداثيات المشهد ، لكن يجب أن يكون من السهل تترجم من أي نظام. ليس لدي أي فكرة عما horizontalScrollBar()->value()
و Vert يعود ... يبدو أنه لا معنى له.
// created here
void EditorWindow::createScene() {
m_scene = new EditorScene(this);
m_view = new EditorView(m_scene);
setCentralWidget(m_view);
connect(m_scene, SIGNAL(mousePosChanged(QPointF)), this, SLOT(mousePosChanged(QPointF)));
}
/// with this constructor
EditorView::EditorView(QGraphicsScene* scene, QWidget* parent) : QGraphicsView(scene, parent) {
setRenderHint(QPainter::Antialiasing);
setCacheMode(QGraphicsView::CacheBackground);
setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
setDragMode(QGraphicsView::NoDrag);
scale(1.0, -1.0); // flip coordinate system so that y increases upwards
fitInView(-5, -5, 10, 10, Qt::KeepAspectRatio);
setInteractive(true);
setBackgroundBrush(QBrush(QColor(232,232,232), Qt::DiagCrossPattern));
}
المحلول 2
لا تهتم. توصل إلى هذا ، والذي يبدو أنه يعمل.
QRectF EditorView::visibleRect() {
QPointF tl(horizontalScrollBar()->value(), verticalScrollBar()->value());
QPointF br = tl + viewport()->rect().bottomRight();
QMatrix mat = matrix().inverted();
return mat.mapRect(QRectF(tl,br));
}
نصائح أخرى
فقط قم بتخطيط مستطيل Viewport المستند إلى البيكسل إلى المشهد باستخدام العرض:
graphicsView->mapToScene(graphicsView->viewport()->geometry()).boundingRect()
وداعا ، مارسيل
فيما يلي حل ممكن (لا يوجد أدنى فكرة عما إذا كان هذا هو الحل المقصود)
QRectF XXX::getCurrrentlyVisibleRegion() const
{
//to receive the currently visible area, map the widgets bounds to the scene
QPointF topLeft = mapToScene (0, 0);
QPointF bottomRight = mapToScene (this->width(), this->height());
return QRectF (topLeft, bottomRight);
}
HTH ، بيرنهارد
أعاد التنفيذ التالي أفضل النتائج بالنسبة لي:
QRectF getVisibleRect( QGraphicsView * view )
{
QPointF A = view->mapToScene( QPoint(0, 0) );
QPointF B = view->mapToScene( QPoint(
view->viewport()->width(),
view->viewport()->height() ));
return QRectF( A, B );
}
هذا يعمل لا يزال جيدًا عندما تظهر أشرطة التمرير. هذا يعمل بشكل صحيح فقط إذا لم يعرض العرض المشهد المتمور أو القص. إذا تم تدوير العرض أو القص ، فإن المستطيل المرئي ليس محورًا متوازيًا في نظام إحداثيات المشهد. في هذه الحالة
view->mapToScene( view->viewport()->geometry() )
إرجاع أ QPolygonF
(وليس QRectF
) وهو المستطيل المرئي في إحداثيات المشهد. على فكرة، QPolygonF
لديه وظيفة عضو boundingRect()
الذي لا يعيد المستطيل المرئي بشكل صحيح للعرض ، ولكن قد يكون مفيدًا على أي حال.
يمكنك أن تفعل ما قمت به ، أو استخدام وظائف Maptoscene (). لا يمكنك الاعتماد على المشهد الناتج "المستطيل" كونه مستطيلًا ، لأنه قد يتم تدوير المشهد أو قصه في المنظر ، مما يؤدي إلى مضلع عام عند تعيينه إلى المشهد.
إذا لم يفعل تطبيقك مثل هذه الأشياء أبدًا ، بالطبع ، فأنت حر في افتراض أن المستطيل مناسب دائمًا.
يبدو أن ما تريده هو مستطيل المشهد. ال ::rect()
الطريقة موروثة من QWidget
. نرى: