Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. [SOLVED] mousePressEvent in QtQuickView
QtWS25 Last Chance

[SOLVED] mousePressEvent in QtQuickView

Scheduled Pinned Locked Moved Solved QML and Qt Quick
mousepresseventeventqwindowqquickwindowqquickview
13 Posts 2 Posters 2.3k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Offline
    M Offline
    madoodia
    wrote on 10 Apr 2020, 16:38 last edited by madoodia 4 Oct 2020, 16:41
    #3

    I got you, but it is not a minimal, because I don't know problem is because of opengl or not
    btw the underlay sample in kdab repo is really minimal

    underlay is using QQuickView as base class and use lib for Rendering, however we don't need to check the lib/meshrenderer
    if we override any event in the QQuickView class it can not detect it and no action on it

    I just added this to the header file

    protected:
      void mousePressEvent(QMouseEvent *e) override;
    

    and this to cpp file to check the event

    void MyQuickView::mousePressEvent(QMouseEvent *e)
    {
      //   qApp->sendEvent(mWindow, e);
      if (!e->isAccepted())
      {
        qDebug("Hello");
        QQuickView::mousePressEvent(e);
      }
    }
    

    and didn't touch the main.qml file

    technically it should work because QQuickView class has virtual functions as events that is inherited from QWindow
    https://doc.qt.io/qt-5/qquickview.html#reimplemented-protected-functions

    make some sense?
    thanks

    1 Reply Last reply
    0
  • F Offline
    F Offline
    fcarney
    wrote on 10 Apr 2020, 16:59 last edited by
    #4

    main.qml:

    import QtQuick 2.12
    import QtQuick.Window 2.12
    
    import QuickTypes 1.0
    
    MouseItem {
        visible: true
        width: 640
        height: 480
        title: qsTr("Mouse Item test")
    }
    

    main.cpp:

    #include <QGuiApplication>
    #include <QQmlApplicationEngine>
    
    #include <mouseitem.h>
    
    int main(int argc, char *argv[])
    {
        QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    
        QGuiApplication app(argc, argv);
    
        qmlRegisterType<MouseItem>("QuickTypes",1,0,"MouseItem");
    
        QQmlApplicationEngine engine;
        const QUrl url(QStringLiteral("qrc:/main.qml"));
        QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                         &app, [url](QObject *obj, const QUrl &objUrl) {
            if (!obj && url == objUrl)
                QCoreApplication::exit(-1);
        }, Qt::QueuedConnection);
        engine.load(url);
    
        return app.exec();
    }
    

    mouseitem.h:

    #ifndef MOUSEITEM_H
    #define MOUSEITEM_H
    
    #include <QQuickView>
    
    class MouseItem : public QQuickView
    {
        Q_OBJECT
    public:
        MouseItem();
    
    protected:
        void mousePressEvent(QMouseEvent *e) override;
    
    };
    
    #endif // MOUSEITEM_H
    

    mouseitem.cpp:

    #include "mouseitem.h"
    
    #include <QDebug>
    
    MouseItem::MouseItem()
        : QQuickView()
    {
    
    }
    
    void MouseItem::mousePressEvent(QMouseEvent *e)
    {
      //   qApp->sendEvent(mWindow, e);
      qDebug() << "mousePressEvent";
      if (!e->isAccepted())
      {
        qDebug("Hello");
        QQuickView::mousePressEvent(e);
      }
    }
    

    I see the text "mousePressEvent", but I don't see the hello. So the events are happening.

    C++ is a perfectly valid school of magic.

    1 Reply Last reply
    0
  • F Offline
    F Offline
    fcarney
    wrote on 10 Apr 2020, 17:27 last edited by
    #5

    Is says here accepted is set true by default. I think if you dont want to accept the event you set it to false (setAccepted). If not you set to true? Not entirely sure.

    C++ is a perfectly valid school of magic.

    1 Reply Last reply
    0
  • M Offline
    M Offline
    madoodia
    wrote on 10 Apr 2020, 18:20 last edited by
    #6

    TBH, I did your method without !e->isAccepted() too, it didn't work
    now it works now, even

    void MouseItem::mousePressEvent(QMouseEvent *e)
    {
      qDebug() << "mousePressEvent";
      qDebug("mousePressEvent");
    }
    

    don't understand
    but there is another problem that it works, and print the message when click on the window, but it freezes the qml controllers
    this is weird.
    will test other events and will leave comment if there is any problem

    1 Reply Last reply
    0
  • M Offline
    M Offline
    madoodia
    wrote on 10 Apr 2020, 19:53 last edited by
    #7

    hey @fcarney
    what if your MouseItem inherites from QQuickItem
    and contain another QQuickWindow or QQuickView class in it, then register the Item?

    you know what I mean?
    A window inside an Item in qml

    1 Reply Last reply
    0
  • F Offline
    F Offline
    fcarney
    wrote on 10 Apr 2020, 20:36 last edited by
    #8

    freezes the qml controllers

    It might be eating all the events. setAccepted to false will be like you didnt handle the event, I think.
    Also, I don't know if you are supposed to embed an Windows in an Item.

    C++ is a perfectly valid school of magic.

    1 Reply Last reply
    0
  • M Offline
    M Offline
    madoodia
    wrote on 13 Apr 2020, 17:18 last edited by
    #9

    it does not reach to that point to check the setAccepted, it does not call mousePressEvent (or any other events) at all
    when you use a Q*Window (object) inside a QQuickItem

    How can we check this? that item will disable window events or not?
    any idea?

    1 Reply Last reply
    0
  • M Offline
    M Offline
    madoodia
    wrote on 14 Apr 2020, 01:59 last edited by
    #10

    This is the more specific question about the mousePressEvent problem
    https://forum.qt.io/topic/113640/why-q-window-events-are-eaten-by-qml-item

    1 Reply Last reply
    0
  • F Offline
    F Offline
    fcarney
    wrote on 14 Apr 2020, 14:13 last edited by
    #11

    Have you tried doing your opengl in a qtquickitem? I wonder if the problem is trying to embed a top level window inside a a qml item.

    C++ is a perfectly valid school of magic.

    1 Reply Last reply
    0
  • M Offline
    M Offline
    madoodia
    wrote on 14 Apr 2020, 15:28 last edited by
    #12

    I did, it works fine and show window contents (3D OpenGL) inside the Item, just I found we should enable mouse accepting, I'm still testing.
    will update the post

    thanks

    1 Reply Last reply
    0
  • M Offline
    M Offline
    madoodia
    wrote on 15 Apr 2020, 18:43 last edited by
    #13

    The problem is solved
    please check this
    https://forum.qt.io/topic/113640/solved-why-q-window-events-are-eaten-by-qml-item

    thanks

    1 Reply Last reply
    0

12/13

14 Apr 2020, 15:28

  • Login

  • Login or register to search.
12 out of 13
  • First post
    12/13
    Last post
0
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved