سؤال

لقد تم سحب شعري مع هذا لساعات. هناك موضوع هنا حول هذا الموضوع ، ولكن لا شيء يبدو أنه يعمل. 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. نرى:

http://doc.qt.io/qt-5/qgraphicsview.html#scenerect-prop

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