Clicking on <select> does not yield a popup, in addition clicking a second time will segfault.
In my case, I don't even want a popup to appear, but QML's onContextMenuRequested does not seem to get fired.
reproduce:
- clone the rendercontrol_rhi example from 6.9.0-rc1
- apply patch (see below)
- press 'Crash me' 2 times in the GUI (it simulates a mouse click, first click it should hit onContextMenuRequested
, 2nd click I don't expect a segfault)
#0 0x00005555574aa0d8 in ()
#1 0x00007ffff13b9011 in QXcbWindow::handleNativeEvent(xcb_generic_event_t*) (this=<optimized out>, event=0x555556cc73b0) at /home/qt/work/qt/qtbase/src/plugins/platforms/xcb/qxcbwindow.cpp:1713
#2 0x00007ffff137e80b in QXcbConnection::handleXcbEvent(xcb_generic_event_t*) (this=this@entry=0x5555555d0520, event=event@entry=0x555556cc73b0)
at /home/qt/work/qt/qtbase/src/plugins/platforms/xcb/qxcbconnection.cpp:695
#3 0x00007ffff137ef06 in QXcbConnection::processXcbEvents(QFlags<QEventLoop::ProcessEventsFlag>) (this=0x5555555d0520, flags=...) at /home/qt/work/qt/qtbase/src/plugins/platforms/xcb/qxcbconnection.cpp:1087
#4 0x00007ffff139ed17 in xcbSourceDispatch(GSource*, GSourceFunc, gpointer) (source=<optimized out>) at /home/qt/work/qt/qtbase/src/plugins/platforms/xcb/qxcbeventdispatcher.cpp:55
#5 0x00007ffff4b1bd3b in g_main_context_dispatch () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#6 0x00007ffff4b712b8 in () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#7 0x00007ffff4b193e3 in g_main_context_iteration () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#8 0x00007ffff5865e8e in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (this=0x55555570ea20, flags=...) at /home/qt/work/qt/qtbase/src/corelib/kernel/qeventdispatcher_glib.cpp:399
#9 0x00007ffff558cd0b in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) (this=this@entry=0x7fffffffd420, flags=..., flags@entry=...) at /home/qt/work/qt/qtbase/src/corelib/global/qflags.h:77
#10 0x00007ffff5588c9a in QCoreApplication::exec() () at /home/qt/work/qt/qtbase/src/corelib/global/qflags.h:77
#11 0x00005555555641ff in main(int, char**) (argc=1, argv=0x7fffffffd818) at /home/foo/qtdeclarative/examples/quick/rendercontrol/rendercontrol_rhi/main.cpp:661
git clone https://code.qt.io/qt/qtdeclarative.git --depth 1 --branch v6.9.0-rc1 git apply patch.diff
commit 4392f36f667c0ce85d3c2664a6de940daf33382f
Author: Foo <foo@foo.com>
Date: Fri Mar 21 19:15:54 2025 +0200
Crash me
diff --git a/examples/quick/rendercontrol/rendercontrol_rhi/CMakeLists.txt b/examples/quick/rendercontrol/rendercontrol_rhi/CMakeLists.txt
index be70e02d..807a3be5 100644
--- a/examples/quick/rendercontrol/rendercontrol_rhi/CMakeLists.txt
+++ b/examples/quick/rendercontrol/rendercontrol_rhi/CMakeLists.txt
@@ -4,9 +4,9 @@
cmake_minimum_required(VERSION 3.16)
project(rendercontrol_rhi LANGUAGES CXX)
-find_package(Qt6 REQUIRED COMPONENTS Core Gui Quick Widgets)
+find_package(Qt6 REQUIRED COMPONENTS Core Gui Quick Widgets WebEngineQuick)
-qt_standard_project_setup(REQUIRES 6.8)
+qt_standard_project_setup(REQUIRES 6.9)
qt_add_executable(rendercontrol_rhi WIN32 MACOSX_BUNDLE
main.cpp
@@ -17,6 +17,8 @@ target_link_libraries(rendercontrol_rhi PRIVATE
Qt6::GuiPrivate
Qt6::Quick
Qt6::Widgets
+ Qt6::WebEngineQuick
+ Qt6::WebEngineCore
)
qt_add_qml_module(rendercontrol_rhi
@@ -25,6 +27,8 @@ qt_add_qml_module(rendercontrol_rhi
"demo.qml"
RESOURCE_PREFIX
"/"
+ RESOURCES
+ index.html
NO_RESOURCE_TARGET_PATH
)
diff --git a/examples/quick/rendercontrol/rendercontrol_rhi/demo.qml b/examples/quick/rendercontrol/rendercontrol_rhi/demo.qml
index 707d9cb3..c80b4d49 100644
--- a/examples/quick/rendercontrol/rendercontrol_rhi/demo.qml
+++ b/examples/quick/rendercontrol/rendercontrol_rhi/demo.qml
@@ -2,155 +2,25 @@
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import QtQuick
-import QtQuick.Particles
+import QtWebEngine
Rectangle {
id: root
- gradient: Gradient {
- GradientStop { position: 0; color: "steelblue" }
- GradientStop { position: 1; color: "black" }
- }
-
- Text {
- anchors.centerIn: parent
- text: "Qt Quick in a texture"
- font.pointSize: 40
- color: "white"
-
- SequentialAnimation on rotation {
- PauseAnimation { duration: 2500 }
- NumberAnimation { from: 0; to: 360; duration: 5000; easing.type: Easing.InOutCubic }
- loops: Animation.Infinite
- }
- }
-
- ParticleSystem {
- id: particles
+ WebEngineView {
+ id: webView
anchors.fill: parent
+ url: "qrc:///index.html"
+ focus: true
+ backgroundColor: "transparent"
- ImageParticle {
- id: smoke
- system: particles
- anchors.fill: parent
- groups: ["A", "B"]
- source: "qrc:///particleresources/glowdot.png"
- colorVariation: 0
- color: "#00111111"
- }
- ImageParticle {
- id: flame
- anchors.fill: parent
- system: particles
- groups: ["C", "D"]
- source: "qrc:///particleresources/glowdot.png"
- colorVariation: 0.1
- color: "#00ff400f"
- }
-
- Emitter {
- id: fire
- system: particles
- group: "C"
-
- y: parent.height
- width: parent.width
-
- emitRate: 350
- lifeSpan: 3500
-
- acceleration: PointDirection { y: -17; xVariation: 3 }
- velocity: PointDirection {xVariation: 3}
-
- size: 24
- sizeVariation: 8
- endSize: 4
- }
-
- TrailEmitter {
- id: fireSmoke
- group: "B"
- system: particles
- follow: "C"
- width: root.width
- height: root.height - 68
-
- emitRatePerParticle: 1
- lifeSpan: 2000
-
- velocity: PointDirection {y:-17*6; yVariation: -17; xVariation: 3}
- acceleration: PointDirection {xVariation: 3}
-
- size: 36
- sizeVariation: 8
- endSize: 16
+ onContextMenuRequested: function(request) { // does not actually run for <select> ?
+ request.accepted = true;
+ console.log("context menu stopped");
}
- TrailEmitter {
- id: fireballFlame
- anchors.fill: parent
- system: particles
- group: "D"
- follow: "E"
-
- emitRatePerParticle: 120
- lifeSpan: 180
- emitWidth: TrailEmitter.ParticleSize
- emitHeight: TrailEmitter.ParticleSize
- emitShape: EllipseShape{}
-
- size: 16
- sizeVariation: 4
- endSize: 4
- }
-
- TrailEmitter {
- id: fireballSmoke
- anchors.fill: parent
- system: particles
- group: "A"
- follow: "E"
-
- emitRatePerParticle: 128
- lifeSpan: 2400
- emitWidth: TrailEmitter.ParticleSize
- emitHeight: TrailEmitter.ParticleSize
- emitShape: EllipseShape{}
-
- velocity: PointDirection {yVariation: 16; xVariation: 16}
- acceleration: PointDirection {y: -16}
-
- size: 24
- sizeVariation: 8
- endSize: 8
- }
-
- Emitter {
- id: balls
- system: particles
- group: "E"
-
- y: parent.height
- width: parent.width
-
- emitRate: 2
- lifeSpan: 7000
-
- velocity: PointDirection {y:-17*4*2; xVariation: 6*6}
- acceleration: PointDirection {y: 17*2; xVariation: 6*6}
-
- size: 8
- sizeVariation: 4
- }
-
- Turbulence { //A bit of turbulence makes the smoke look better
- anchors.fill: parent
- groups: ["A","B"]
- strength: 32
- system: particles
+ onJavaScriptConsoleMessage: function(level, message, lineNumber, sourceID) {
+ console.log(message);
}
}
-
- onWidthChanged: particles.reset()
- onHeightChanged: particles.reset()
}
diff --git a/examples/quick/rendercontrol/rendercontrol_rhi/index.html b/examples/quick/rendercontrol/rendercontrol_rhi/index.html
new file mode 100644
index 00000000..b5adb73a
--- /dev/null
+++ b/examples/quick/rendercontrol/rendercontrol_rhi/index.html
@@ -0,0 +1,20 @@
+<select style="width:100%;height:100%;">
+ <option value="volvo">Volvo</option>
+ <option value="saab">Saab</option>
+ <option value="mercedes">Mercedes</option>
+ <option value="audi">Audi</option>
+</select>
+
+<script>
+ document.addEventListener('mousedown', (event) => {
+ console.log(`left mouse button down at X: ${event.clientX}, Y: ${event.clientY}`);
+ });
+
+ document.addEventListener('mouseup', (event) => {
+ console.log(`Mouse button released at X: ${event.clientX}, Y: ${event.clientY}`);
+ });
+
+ document.addEventListener('click', (event) => {
+ console.log(`Click detected at X: ${event.clientX}, Y: ${event.clientY}`);
+ });
+</script>
\ No newline at end of file
diff --git a/examples/quick/rendercontrol/rendercontrol_rhi/main.cpp b/examples/quick/rendercontrol/rendercontrol_rhi/main.cpp
index 6b66d76e..96a21c71 100644
--- a/examples/quick/rendercontrol/rendercontrol_rhi/main.cpp
+++ b/examples/quick/rendercontrol/rendercontrol_rhi/main.cpp
@@ -8,6 +8,7 @@
#include <QMenuBar>
#include <QStatusBar>
#include <QFileDialog>
+#include <QTimer>
#include <QMessageBox>
#include <QLabel>
#include <QScrollArea>
@@ -144,6 +145,29 @@ MainWindow::MainWindow()
});
controlLayout->addWidget(btnMulti);
+ QPushButton *btnCrash = new QPushButton(tr("Crash me"));
+ QObject::connect(btnCrash, &QPushButton::clicked, btn, [this] {
+ QMetaObject::invokeMethod(this, [=] {
+ constexpr auto mouse_pos = QPointF(100, 100);
+ constexpr Qt::MouseButton mouse_btn = Qt::LeftButton;
+ constexpr QEvent::Type mouse_press = QEvent::MouseButtonPress;
+ constexpr QEvent::Type mouse_release = QEvent::MouseButtonRelease;
+
+ // left click
+ QMouseEvent mouseEvent(mouse_press, mouse_pos, mouse_pos, mouse_btn, mouse_btn, Qt::NoModifier);
+ QCoreApplication::sendEvent(m_scene.get(), &mouseEvent);
+
+ // left release
+ QTimer::singleShot(50, this, [this, mouse_btn, mouse_release, mouse_pos]() {
+ QMouseEvent mouseEvent2(mouse_release, mouse_pos, mouse_pos, mouse_btn, mouse_btn, Qt::NoModifier);
+
+ QCoreApplication::sendEvent(m_scene.get(), &mouseEvent2);
+ });
+
+ }, Qt::QueuedConnection);
+ });
+ controlLayout->addWidget(btnCrash);
+
//! [anim-slider]
QSlider *animSlider = new QSlider;
animSlider->setOrientation(Qt::Horizontal);