PDA

View Full Version : Disable Scroll in QGraphicsview



hereiam
16th July 2020, 12:27
Hi there,

I want to scroll a Scene in QGraphicsView with external contol. So i want to disable scroll event with keys an wheel directly in the QGraphicsView class.

How can I do this?

Ginsengelf
17th July 2020, 08:08
Hi, you could install an event filter and catch the key and wheel events there. The documentation for QObject::installEventFilter() shows an example how to "eat" an event.

Ginsengelf

hereiam
22nd July 2020, 22:59
class MyClass : public QGraphicsScene
{
public:
MyClass(QObject *parent = nullptr);
bool eventFilter(QObject *obj, QEvent *event) override;
};

MyClass::MyClass(QObject *parent) :
QGraphicsScene(parent)
{
this->installEventFilter(this);
}


bool MyClass::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::GraphicsSceneWheel)
{
// QWheelEvent *wheelEvent = static_cast<QWheelEvent*>(event);
return true;
}
else
{
// standard event processing
return QObject::eventFilter(obj, event);
}
}



I have installed an event filter in my inherited class "Myclass". But it has no effect.

The wheel event is still active, if I scroll the mouse wheel in the scene.

d_stranz
22nd July 2020, 23:19
I have installed an event filter in my inherited class "Myclass". But it has no effect.

Your class inherits from QGraphicsScene, which is simply a container for QGraphicsItem instances. It has no visual representation on screen and therefore has no mouse, wheel, or any other input event associated with it.

You probably want to install your event filter on QGraphicsView (and not on a class derived from it, as you have done with your MyClass implementation). It makes no sense to create and install an event filter on an instance of a class itself - if you are going to derive from a class, then simply override the base class methods for the events you want to handle.

The purpose of an event filter is so you can watch events occurring in an instance of one class from a different class. So in your case, you should create the event filter method in your MainWindow class (for example) and install it on your QGraphicsView class.

hereiam
30th August 2020, 15:37
I have installed an event filter on QGraphicView but it also has no effect.



class MouseEventFilter : public QObject
{
Q_OBJECT

public:
MouseEventFilter(QObject *parent = nullptr);

protected:
bool eventFilter(QObject *obj, QEvent *event) override;
};

MouseEventFilter::MouseEventFilter(QObject *parent) :
QObject(parent)
{
}

bool MouseEventFilter::eventFilter(QObject *obj, QEvent *event)
{
// The event is always eaten but the scroll is still active
if (event->type() == QEvent::Wheel)
{
QWheelEvent *wheelEvent = static_cast<QWheelEvent*>(event);
qDebug("Ate key press %d", wheelEvent->phase());
return true;
}
else
{
// standard event processing
return QObject::eventFilter(obj, event);
}
}




this->myView = new QGraphicsView(parent);
this->myView->installEventFilter(new MouseEventFilter(this));

d_stranz
31st August 2020, 01:19
I have installed an event filter on QGraphicView but it also has no effect.

How do you know? Have you run your code in the debugger to see if your event filter is called with any event at all?

Have you disabled the scroll bars in the view (QAbstractScrollArea::setVerticalScrollBarPolicy() , QAbstractScrollArea::setHorizontalScrollBarPolicy( ))?

hereiam
31st August 2020, 13:30
Yes, I have used the debugger. The event is called and it has no effect.
Right, I have disabled both scrollbars.



this->myView = new QGraphicsView(this->myScene);
this->myView->setViewportUpdateMode(QGraphicsView::BoundingRectV iewportUpdate);
this->myView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOf f);
this->myView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff) ;
this->myView->centerOn(0, 0);
this->myView->setFixedWidth(110);
this->myView->setDragMode(QGraphicsView::NoDrag);
this->myView->setFocusPolicy(Qt::NoFocus);
this->myView->installEventFilter(new MouseEventFilter(this));