2009-08-31 2 views
8

Я вытягиваю волосы с этим часами. Там есть нить here, но ничего не работает. QGraphicsView :: rect() вернет ширину и высоту, но значения left и top установлены неправильно (всегда 0 - игнорирование прокрученной суммы). Я хочу его в координатах сцены, но его нужно легко перевести из любой системы. Я понятия не имею, что horizontalScrollBar()->value() и верст возвращаются ... кажется, бессмысленными смехами.Получите видимый прямоугольник QGraphicsView?


@fabrizioM:

// 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)); 
} 
+0

Поцарапайте, что ... значения полосы прокрутки относительно ... ну, это не может быть sceneRect(), потому что это float ... но что-то подобное. – mpen

+0

Возможно, как вы создаете QGraphicsView, любой фрагмент кода? – fabrizioM

+0

Я не уверен, какой код вы хотите точно. На самом деле не имеет значения, как я его построю ... получение видимого прямоугольника должно быть точно таким же. – mpen

ответ

3

Nevermind. Это сработало.

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)); 
} 
+1

Тем не менее, ваш ответ очень помог мне. Спасибо! – Eike

1

Похоже, что вы хотите, это прямоугольник сцены. Метод ::rect() наследуется от QWidget. См:

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

+0

Вы прочитали описание? «Прямоугольник сцены определяет степень сцены, и в случае представления это означает область сцены, которую вы можете перемещать, используя полосы прокрутки». sceneRect возвращает * целую * сцену, а не только область, видимую в данный момент (подраздел сцены). – mpen

+0

Поднят прямо из документов; «Это свойство удерживает область сцены, визуализированную в этом представлении». Это то, что вы хотите? Вы также можете использовать mapTo и mapFrom для преобразования между системами координат. –

+0

Документы не ясны. Что означает «визуализированный»? Означает ли это область сцены, с которой вы работаете, или только то, что сейчас нарисовано? Если у вас есть огромная сцена, которую вы можете прокручивать, этот выбор слов неоднозначен. Я тоже был смущен. похоже, что это целая сцена, а не только область, которую вы можете увидеть в образе прямо сейчас. – Rafe

2

Вы можете делать то, что вы сделали, или использовать функции mapToScene(). Вы не можете рассчитывать на то, что результирующая сцена «прямоугольник» является прямоугольником, однако, поскольку сцена может быть повернута или сдвинута в представлении, что приводит к общему полигону при отображении на сцену.

Если ваше приложение никогда не делает такие вещи, конечно, вы можете предположить, что прямоугольник всегда уместен.

+0

Карта * Что * на сцену? Кажется, я не могу получить нужную мне информацию, кроме полос прокрутки. – mpen

3

здесь является возможным решением (не догадываются ли это предполагаемый один)

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); 
} 

НТН, Бернхард

+0

В Qt 4.7.4 большинство ответов здесь не работают. Координаты вида (0, 0), похоже, не всегда находятся в верхнем левом углу видимой области. Вместо этого система координат вида перемещается полосами прокрутки. Однако метод Марка работает! (для меня) – Eike

16

Просто карта пикселя на основе видового прямоугольника на сцену, используя вид:

graphicsView->mapToScene(graphicsView->viewport()->geometry()).boundingRect() 

Bye, Марсель

+4

Может быть короче использовать 'graphicsView-> rect()' вместо 'graphicsView-> viewport() -> geometry()'. – Sharpie

3

Следующая реализация вернулись лучшие результаты для меня:

QRectF getVisibleRect(QGraphicsView * view) 
{ 
    QPointF A = view ->mapToScene(QPointF(0,0)), 
    QPointF B = view ->mapToScene(QPointF( 
     view->viewport()->width(), 
     view->viewport()->height()); 
    return QRectF(A, B); 
} 

Это все еще работает очень хорошо, когда появляются полосы прокрутки. Это работает только в том случае, если представление не отображает сцену, повернутую или сдвинутую. Если вид повернут или сдвинут, то видимый прямоугольник не параллелен оси в системе координат сцены. В этом случае

view->mapToScene(view->viewport()->geometry()) 

возвращает QPolygonF (не QRectF), который является видимым прямоугольник в координатах сцены. Кстати, QPolygonF имеет функцию-член boundingRect(), которая не возвращает правильный видимый прямоугольник представления, но может быть полезна в любом случае.

+0

В приведенном вами примере кода много ошибок! – ForeverLearning

Смежные вопросы