QGraphicsView - add function to get RubberBand rect

In many situations it is handy to know the rubberband rect.
There are many situations where we want to show something
related to the rubberband.

Regardless how that is done the rubberband area is needed.
(Not having this is a flaw that can force people to do make
a customized rubberband just to get this information)

Change-Id: Ia854db4c0022b6a97b150af2b4bb78fd5e974991
Reviewed-by: Andreas Aardal Hanssen <andreas@hanssen.name>
Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
This commit is contained in:
Thorbjørn Lund Martsum 2012-12-10 08:16:31 +01:00 committed by The Qt Project
parent 932c50c015
commit c56f73cc1e
4 changed files with 61 additions and 4 deletions

4
dist/changes-5.1.0 vendored
View File

@ -82,7 +82,11 @@ QtNetwork
-
QtWidgets
---------
- QGraphicsView:
* Added function rubberBandRect()
****************************************************************************
* Database Drivers *

View File

@ -1496,7 +1496,7 @@ void QGraphicsView::setDragMode(DragMode mode)
The default value is Qt::IntersectsItemShape; all items whose shape
intersects with or is contained by the rubber band are selected.
\sa dragMode, items()
\sa dragMode, items(), rubberBandRect()
*/
Qt::ItemSelectionMode QGraphicsView::rubberBandSelectionMode() const
{
@ -1508,6 +1508,27 @@ void QGraphicsView::setRubberBandSelectionMode(Qt::ItemSelectionMode mode)
Q_D(QGraphicsView);
d->rubberBandSelectionMode = mode;
}
/*!
\since 5.1
This functions returns the current rubber band area (in viewport coordinates) if the user
is currently doing an itemselection with rubber band. When the user is not using the
rubber band this functions returns (a null) QRectF().
Notice that part of this QRect can be outise the visual viewport. It can e.g
contain negative values.
\sa rubberBandSelectionMode
*/
QRect QGraphicsView::rubberBandRect() const
{
Q_D(const QGraphicsView);
if (d->dragMode != QGraphicsView::RubberBandDrag || !d->sceneInteractionAllowed || !d->rubberBanding)
return QRect();
return d->rubberBandRect;
}
#endif
/*!

View File

@ -146,6 +146,7 @@ public:
#ifndef QT_NO_RUBBERBAND
Qt::ItemSelectionMode rubberBandSelectionMode() const;
void setRubberBandSelectionMode(Qt::ItemSelectionMode mode);
QRect rubberBandRect() const;
#endif
CacheMode cacheMode() const;

View File

@ -62,7 +62,7 @@ class MyGraphicsView : public QGraphicsView
{
public:
MyGraphicsView() : QGraphicsView()
MyGraphicsView(QWidget *w, QLabel *l) : QGraphicsView(w), rubberbandLabel(l)
{
setDragMode(QGraphicsView::RubberBandDrag);
}
@ -80,13 +80,43 @@ protected:
int yglobal = event->globalY();
if (yglobal > bottomPos)
verticalScrollBar()->setValue(verticalScrollBar()->value() + 10);
updateRubberbandInfo();
}
void mouseReleaseEvent(QMouseEvent *event)
{
QGraphicsView::mouseReleaseEvent(event);
updateRubberbandInfo();
}
void wheelEvent (QWheelEvent *event)
{
QGraphicsView::wheelEvent(event);
updateRubberbandInfo();
}
void updateRubberbandInfo()
{
QString textToShow;
QDebug s(&textToShow);
s << rubberBandRect();
if (rubberbandLabel->text() != textToShow)
rubberbandLabel->setText(textToShow);
}
QLabel *rubberbandLabel;
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyGraphicsView v;
QWidget w;
w.setLayout(new QVBoxLayout);
QLabel *l = new QLabel(&w);
MyGraphicsView &v = *(new MyGraphicsView(&w, l));
w.layout()->addWidget(&v);
w.layout()->addWidget(l);
QGraphicsScene s(0.0, 0.0, 5000.0, 5000.0);
v.setScene(&s);
@ -100,7 +130,8 @@ int main(int argc, char *argv[])
item->setRect(QRectF(v * 80.0, u * 80.0, 50.0, 20.0));
s.addItem(item);
}
v.show();
w.show();
app.exec();
return 0;
}