QGraphicsView - emit signal when rubber band changes.
The rubberBandRect function is nice to have, but this patch makes it easier to track the rubber band by emiting a signal on change. That makes it easier (and less clumsy/hacky) to show information related to the rubber band. Change-Id: If65eb85d743a1804be3fdb823a821423411e9745 Reviewed-by: Andreas Aardal Hanssen <andreas@hanssen.name> Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
This commit is contained in:
parent
c56f73cc1e
commit
717a0a9d04
2
dist/changes-5.1.0
vendored
2
dist/changes-5.1.0
vendored
@ -86,7 +86,7 @@ QtWidgets
|
||||
---------
|
||||
|
||||
- QGraphicsView:
|
||||
* Added function rubberBandRect()
|
||||
* Added function rubberBandRect() and signal rubberBandChanged.
|
||||
|
||||
****************************************************************************
|
||||
* Database Drivers *
|
||||
|
@ -256,6 +256,20 @@ static const int QGRAPHICSVIEW_PREALLOC_STYLE_OPTIONS = 503; // largest prime <
|
||||
\sa dragMode, QGraphicsScene::setSelectionArea()
|
||||
*/
|
||||
|
||||
/*!
|
||||
\since 5.1
|
||||
|
||||
\fn void QGraphicsView::rubberBandChanged(QRect rubberBandRect, QPointF fromScenePoint, QPointF toScenePoint)
|
||||
|
||||
This signal is emitted when the rubber band rect is changed. The viewport Rect is specified by \a rubberBandRect.
|
||||
The drag start position and drag end position are provided in scene points with \a fromScenePoint and \a toScenePoint.
|
||||
|
||||
When rubberband selection ends this signal will be emitted with null vales.
|
||||
|
||||
\sa rubberBandRect()
|
||||
*/
|
||||
|
||||
|
||||
#include "qgraphicsview.h"
|
||||
#include "qgraphicsview_p.h"
|
||||
|
||||
@ -727,16 +741,27 @@ void QGraphicsViewPrivate::updateRubberBand(const QMouseEvent *event)
|
||||
// if we didn't get the release events).
|
||||
if (!event->buttons()) {
|
||||
rubberBanding = false;
|
||||
if (!rubberBandRect.isNull()) {
|
||||
rubberBandRect = QRect();
|
||||
emit q->rubberBandChanged(rubberBandRect, QPointF(), QPointF());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
QRect oldRubberband = rubberBandRect;
|
||||
|
||||
// Update rubberband position
|
||||
const QPoint mp = q->mapFromScene(mousePressScenePoint);
|
||||
const QPoint ep = event->pos();
|
||||
rubberBandRect = QRect(qMin(mp.x(), ep.x()), qMin(mp.y(), ep.y()),
|
||||
qAbs(mp.x() - ep.x()) + 1, qAbs(mp.y() - ep.y()) + 1);
|
||||
|
||||
if (rubberBandRect != oldRubberband || lastRubberbandScenePoint != lastMouseMoveScenePoint) {
|
||||
lastRubberbandScenePoint = lastMouseMoveScenePoint;
|
||||
oldRubberband = rubberBandRect;
|
||||
emit q->rubberBandChanged(rubberBandRect, mousePressScenePoint, lastRubberbandScenePoint);
|
||||
}
|
||||
|
||||
// Update new rubberband
|
||||
if (viewportUpdateMode != QGraphicsView::NoViewportUpdate) {
|
||||
if (viewportUpdateMode != QGraphicsView::FullViewportUpdate)
|
||||
@ -1518,7 +1543,7 @@ void QGraphicsView::setRubberBandSelectionMode(Qt::ItemSelectionMode mode)
|
||||
Notice that part of this QRect can be outise the visual viewport. It can e.g
|
||||
contain negative values.
|
||||
|
||||
\sa rubberBandSelectionMode
|
||||
\sa rubberBandSelectionMode, rubberBandChanged()
|
||||
*/
|
||||
|
||||
QRect QGraphicsView::rubberBandRect() const
|
||||
@ -3316,7 +3341,10 @@ void QGraphicsView::mouseReleaseEvent(QMouseEvent *event)
|
||||
d->updateAll();
|
||||
}
|
||||
d->rubberBanding = false;
|
||||
if (!d->rubberBandRect.isNull()) {
|
||||
d->rubberBandRect = QRect();
|
||||
emit rubberBandChanged(d->rubberBandRect, QPointF(), QPointF());
|
||||
}
|
||||
}
|
||||
} else
|
||||
#endif
|
||||
|
@ -227,6 +227,11 @@ public Q_SLOTS:
|
||||
void invalidateScene(const QRectF &rect = QRectF(), QGraphicsScene::SceneLayers layers = QGraphicsScene::AllLayers);
|
||||
void updateSceneRect(const QRectF &rect);
|
||||
|
||||
#ifndef QT_NO_RUBBERBAND
|
||||
Q_SIGNALS:
|
||||
void rubberBandChanged(QRect viewportRect, QPointF fromScenePoint, QPointF toScenePoint);
|
||||
#endif
|
||||
|
||||
protected Q_SLOTS:
|
||||
void setupViewport(QWidget *widget);
|
||||
|
||||
|
@ -110,6 +110,7 @@ public:
|
||||
QPoint mousePressViewPoint;
|
||||
QPoint mousePressScreenPoint;
|
||||
QPointF lastMouseMoveScenePoint;
|
||||
QPointF lastRubberbandScenePoint;
|
||||
QPoint lastMouseMoveScreenPoint;
|
||||
QPoint dirtyScrollOffset;
|
||||
Qt::MouseButton mousePressButton;
|
||||
|
@ -60,11 +60,12 @@ public:
|
||||
|
||||
class MyGraphicsView : public QGraphicsView
|
||||
{
|
||||
|
||||
Q_OBJECT
|
||||
public:
|
||||
MyGraphicsView(QWidget *w, QLabel *l) : QGraphicsView(w), rubberbandLabel(l)
|
||||
{
|
||||
setDragMode(QGraphicsView::RubberBandDrag);
|
||||
connect(this, SIGNAL(rubberBandChanged(QRect, QPointF, QPointF)), this, SLOT(updateRubberbandInfo(QRect, QPointF, QPointF)));
|
||||
}
|
||||
protected:
|
||||
void mouseMoveEvent(QMouseEvent *event)
|
||||
@ -80,29 +81,17 @@ 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()
|
||||
protected slots:
|
||||
void updateRubberbandInfo(QRect r, QPointF from, QPointF to)
|
||||
{
|
||||
QString textToShow;
|
||||
QDebug s(&textToShow);
|
||||
s << rubberBandRect();
|
||||
if (rubberbandLabel->text() != textToShow)
|
||||
s << r << from << to;
|
||||
rubberbandLabel->setText(textToShow);
|
||||
}
|
||||
protected:
|
||||
QLabel *rubberbandLabel;
|
||||
};
|
||||
|
||||
@ -135,3 +124,5 @@ int main(int argc, char *argv[])
|
||||
app.exec();
|
||||
return 0;
|
||||
}
|
||||
|
||||
#include "rubberbandtest.moc"
|
||||
|
Loading…
Reference in New Issue
Block a user