[SOLVED] mousePressEvent in QtQuickView
-
Show us a minimal class and qml file the view is used in. Examples don't help. It could be a lot of simple things. Create a small side project that has the problem and post that.
-
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 minimalunderlay
is usingQQuickView
as base class and uselib
forRendering
, however we don't need to check thelib/meshrenderer
if weoverride
anyevent
in theQQuickView
class it can not detect it and no action on itI 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
filetechnically it should work because
QQuickView
class has virtual functions as events that is inherited fromQWindow
https://doc.qt.io/qt-5/qquickview.html#reimplemented-protected-functionsmake some sense?
thanks -
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.
-
TBH, I did your method without
!e->isAccepted()
too, it didn't work
now it works now, evenvoid 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 -
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. -
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 aQ*Window
(object) inside aQQuickItem
How can we check this? that item will disable window events or not?
any idea? -
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 -
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.
-
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 postthanks
-
The problem is solved
please check this
https://forum.qt.io/topic/113640/solved-why-q-window-events-are-eaten-by-qml-itemthanks
11/13