访问QML中的mouse.button变量



我正在尝试一些东西来加强我对C++和QML的体验。

我有一个MouseArea项目。我想通过">onPressed">onReleased";以及">onPositionChanged";事件到后端,我正试图用C++编写。事实上,我希望这是干净和简单的代码。我可以通过QML写作来做任何我想做的事。

问题是我无法定义">鼠标按钮";C++端MouseArea的变量。我得到的错误像:

qrc:/main.qml:58: Error: Unknown method parameter type: Qt::MouseButton

我的QML脚本:

.
.
Item{
id: item
anchors.fill: parent
Viewer{
id: viewer
}
MouseArea{
id: viewerMouseArea
anchors.fill: parent
hoverEnabled: true
acceptedButtons: Qt.RightButton | Qt.LeftButton | Qt.MiddleButton
onPressed: {
//console.log("Mouse buttons in mouse area pressed.");
viewer.mousePressEvent(mouseX, mouseY, mouse.button);
}
onReleased:{
//console.log("Mouse buttons in mouse area released.")
viewer.mouseReleaseEvent(mouseX, mouseY, mouse.button);
}
onPositionChanged:{
//console.log("Position of cursor in mouse area changed.")
//viewer.mouseMoveEvent(x, mouseY);
}
}
}
.
.

我的C++后端代码:

.
.
void Viewer::mousePressEvent(double x, double y, Qt::MouseButton button) {
qDebug() << "Viewer::mousePressEvent()";
}
void Viewer::mouseReleaseEvent(double x, double y, Qt::MouseButton button) {
qDebug() << "Viewer::mouseReleaseEvent()";
}
void Viewer::mouseMoveEvent(double x, double y) {
qDebug() << "Viewer::mouseMoveEvent()";
}
.
.

如何在C++中访问QML中的mouse.button变量?

我查看了这里的文档。https://doc.qt.io/qt-6/qt.html#MouseButton-enum我通过直接使用无符号整数来解决它。

void Viewer::mousePressEvent(double x, double y, quint32 button) {
qDebug() << "Viewer::mousePressEvent()";
qDebug() << "x: " << x << " y: " << y << " button: " << button;
}
void Viewer::mouseReleaseEvent(double x, double y, quint32 button) {
qDebug() << "Viewer::mouseReleaseEvent()";
qDebug() << "x: " << x << " y: " << y << " button: " << button;
}
void Viewer::mouseMoveEvent(double x, double y) {
qDebug() << "Viewer::mouseMoveEvent()";
}

如果你有更好的解决方案建议,请告诉我。我将不胜感激。

控制台输出:

Viewer::mousePressEvent()
x:  243  y:  161  button:  2
Viewer::mouseReleaseEvent()
Viewer::mousePressEvent()
x:  282  y:  183  button:  1
Viewer::mouseReleaseEvent()
Viewer::mousePressEvent()
x:  277  y:  138  button:  4
Viewer::mouseReleaseEvent()

事实上,我发现在QML中用MouseArea.acceptedButtons指定的点击会导致这些点击不再传播到C++端。在这种情况下,您可以在QML中设置MouseAreaobjectName,并在C++端使用findChild((来查找它,并实现如本答案中所述的事件过滤器。

最新更新