QML:鼠标区域重叠的问题
QML: Problems with mousearea overlapping
我有一个 QML 应用程序和 MouseAreas 的问题。
在一个小的测试应用中,有一个红色的矩形,当鼠标进入这个矩形时,下面会出现一个灰色的菜单(使用加载程序创建)。
当鼠标悬停在红色矩形或菜单上时,必须打开此灰色菜单。为此,我有 2 个 MouseAreas,1 个在红色矩形上方,1 个在菜单上方。
两者都是 'hoverEnabled','enter' 和 'exit' 我控制 'hoverDialog' 和 'hoverTopZone'。
当两者都为 false 时,表示鼠标已松开,因此我关闭了菜单(使用信号,Loader 变为非活动状态)。
计时器是必需的,因为当从 'mouseAreaTopZone' 传递到 'mouseAreaDialog' 时,'hoverDialog' 和 'hoverTopZone' 都为假。
用定时器固定。
在菜单中间有一个绿色的矩形,并且(只有)当鼠标在上面时,黄色的矩形必须是可见的。
这是我的问题。我在绿色矩形内有一个 MouseArea,但在需要时黄色矩形不可见。
如果我将 'rectGreen' 移动到 'mouseAreaTopZone' 和 'mouseAreaDialog' 下方(即,在文件末尾),当鼠标悬停在绿色矩形上时,我会看到黄色矩形,因为它的鼠标区域是 'topmost'
但在这种情况下,菜单对话框关闭,因为当鼠标进入绿色矩形内的 MouseArea 时,hoverDialog 和 hoverTopZone 为 false...
希望你能理解我的问题...这是我的代码:
Test.qml
import QtQuick 2.5
import QtQuick.Controls 1.3
import QtQuick.Window 2.0
Item {
width: 800
height: 800
Rectangle{
id: rect
anchors { top: parent.top; topMargin: 100; horizontalCenter: parent.horizontalCenter }
height: 50; width: 50
color: "red"
MouseArea {
anchors.fill: parent
hoverEnabled: true
onEntered: loader_dialog.active = true
}
}
Loader {
id: loader_dialog
anchors { top: rect.bottom; horizontalCenter: rect.horizontalCenter}
active: false
sourceComponent: TestMenu {
onClose: loader_dialog.active = false;
}
}
}
TestMenu.qml
import QtQuick 2.0
Rectangle {
id: id_dialog
signal close()
width: 400
height: 600
color: "lightgrey"
property bool hoverDialog: false
property bool hoverTopZone: false
function update() {
if (!hoverDialog && !hoverTopZone)
timer.start();
}
function check() {
if (!hoverDialog && !hoverTopZone)
{
console.log("close");
id_dialog.close();
}
}
Timer {
id: timer
interval: 100
running: false
repeat: false
onTriggered: check();
}
Rectangle {
id: rectGreen
width: 200; height: 100
anchors.centerIn: parent
color: "green"
Rectangle {
id: rectYellow
anchors.centerIn: parent
width: 50; height: 50
color: "yellow"
visible: false
}
MouseArea {
anchors.fill: parent
hoverEnabled: true
onEntered: { rectYellow.visible = true; }
onExited: { rectYellow.visible = false }
}
}
MouseArea {
id: mouseAreaTopZone
anchors { bottom: parent.top; horizontalCenter: parent.horizontalCenter}
width: 50; height: 50
hoverEnabled: true
onEntered: { hoverTopZone = true; id_dialog.update(); }
onExited: { hoverTopZone = false; id_dialog.update(); }
}
MouseArea {
id: mouseAreaDialog
anchors.fill: parent
hoverEnabled: true
onEntered: { hoverDialog = true; id_dialog.update(); }
onExited: { hoverDialog = false; id_dialog.update(); }
}
}
提前致谢,
迭戈
感谢 Mark Ch 的帮助。
我需要在鼠标退出时关闭对话框,所以我想我不能使用'Popup'控件...
我解决了这个问题。只使用一个变量来知道鼠标是否在我的对话框上 ('m_iNumHovered'),我每次进入鼠标区域时都添加一个引用,并在退出时减少它。关键是 add/remove MouseArea 中绿色矩形上的引用,以保持它 'm_iNumHovered=true'(对话框可见)
TestMenu.qml 的新代码:
import QtQuick 2.0
Rectangle {
id: id_dialog
signal close()
width: 400
height: 600
color: "lightgrey"
property int m_iNumHovered: 0
onM_iNumHoveredChanged: update();
function update() {
if (m_iNumHovered == 0)
timer.start();
}
function check() {
if (m_iNumHovered == 0)
id_dialog.close();
}
Timer {
id: timer
interval: 100
running: false
repeat: false
onTriggered: check();
}
MouseArea {
id: mouseAreaTopZone
anchors { bottom: parent.top; horizontalCenter: parent.horizontalCenter}
width: 50; height: 50
hoverEnabled: true
onEntered: m_iNumHovered++;
onExited: m_iNumHovered--;
}
MouseArea {
id: mouseAreaDialog
anchors.fill: parent
hoverEnabled: true
onEntered: m_iNumHovered++;
onExited: m_iNumHovered--;
}
Rectangle {
id: rectGreen
width: 200; height: 100
anchors.centerIn: parent
color: "green"
Rectangle {
id: rectYellow
anchors.centerIn: parent
width: 50; height: 50
color: "yellow"
visible: false
}
MouseArea {
anchors.fill: parent
hoverEnabled: true
onEntered: { m_iNumHovered++; rectYellow.visible = true; }
onExited: { m_iNumHovered--; rectYellow.visible = false }
}
}
}
我有一个 QML 应用程序和 MouseAreas 的问题。
在一个小的测试应用中,有一个红色的矩形,当鼠标进入这个矩形时,下面会出现一个灰色的菜单(使用加载程序创建)。
当鼠标悬停在红色矩形或菜单上时,必须打开此灰色菜单。为此,我有 2 个 MouseAreas,1 个在红色矩形上方,1 个在菜单上方。 两者都是 'hoverEnabled','enter' 和 'exit' 我控制 'hoverDialog' 和 'hoverTopZone'。
当两者都为 false 时,表示鼠标已松开,因此我关闭了菜单(使用信号,Loader 变为非活动状态)。
计时器是必需的,因为当从 'mouseAreaTopZone' 传递到 'mouseAreaDialog' 时,'hoverDialog' 和 'hoverTopZone' 都为假。 用定时器固定。
在菜单中间有一个绿色的矩形,并且(只有)当鼠标在上面时,黄色的矩形必须是可见的。
这是我的问题。我在绿色矩形内有一个 MouseArea,但在需要时黄色矩形不可见。
如果我将 'rectGreen' 移动到 'mouseAreaTopZone' 和 'mouseAreaDialog' 下方(即,在文件末尾),当鼠标悬停在绿色矩形上时,我会看到黄色矩形,因为它的鼠标区域是 'topmost'
但在这种情况下,菜单对话框关闭,因为当鼠标进入绿色矩形内的 MouseArea 时,hoverDialog 和 hoverTopZone 为 false...
希望你能理解我的问题...这是我的代码:
Test.qml
import QtQuick 2.5
import QtQuick.Controls 1.3
import QtQuick.Window 2.0
Item {
width: 800
height: 800
Rectangle{
id: rect
anchors { top: parent.top; topMargin: 100; horizontalCenter: parent.horizontalCenter }
height: 50; width: 50
color: "red"
MouseArea {
anchors.fill: parent
hoverEnabled: true
onEntered: loader_dialog.active = true
}
}
Loader {
id: loader_dialog
anchors { top: rect.bottom; horizontalCenter: rect.horizontalCenter}
active: false
sourceComponent: TestMenu {
onClose: loader_dialog.active = false;
}
}
}
TestMenu.qml
import QtQuick 2.0
Rectangle {
id: id_dialog
signal close()
width: 400
height: 600
color: "lightgrey"
property bool hoverDialog: false
property bool hoverTopZone: false
function update() {
if (!hoverDialog && !hoverTopZone)
timer.start();
}
function check() {
if (!hoverDialog && !hoverTopZone)
{
console.log("close");
id_dialog.close();
}
}
Timer {
id: timer
interval: 100
running: false
repeat: false
onTriggered: check();
}
Rectangle {
id: rectGreen
width: 200; height: 100
anchors.centerIn: parent
color: "green"
Rectangle {
id: rectYellow
anchors.centerIn: parent
width: 50; height: 50
color: "yellow"
visible: false
}
MouseArea {
anchors.fill: parent
hoverEnabled: true
onEntered: { rectYellow.visible = true; }
onExited: { rectYellow.visible = false }
}
}
MouseArea {
id: mouseAreaTopZone
anchors { bottom: parent.top; horizontalCenter: parent.horizontalCenter}
width: 50; height: 50
hoverEnabled: true
onEntered: { hoverTopZone = true; id_dialog.update(); }
onExited: { hoverTopZone = false; id_dialog.update(); }
}
MouseArea {
id: mouseAreaDialog
anchors.fill: parent
hoverEnabled: true
onEntered: { hoverDialog = true; id_dialog.update(); }
onExited: { hoverDialog = false; id_dialog.update(); }
}
}
提前致谢, 迭戈
感谢 Mark Ch 的帮助。
我需要在鼠标退出时关闭对话框,所以我想我不能使用'Popup'控件...
我解决了这个问题。只使用一个变量来知道鼠标是否在我的对话框上 ('m_iNumHovered'),我每次进入鼠标区域时都添加一个引用,并在退出时减少它。关键是 add/remove MouseArea 中绿色矩形上的引用,以保持它 'm_iNumHovered=true'(对话框可见)
TestMenu.qml 的新代码:
import QtQuick 2.0
Rectangle {
id: id_dialog
signal close()
width: 400
height: 600
color: "lightgrey"
property int m_iNumHovered: 0
onM_iNumHoveredChanged: update();
function update() {
if (m_iNumHovered == 0)
timer.start();
}
function check() {
if (m_iNumHovered == 0)
id_dialog.close();
}
Timer {
id: timer
interval: 100
running: false
repeat: false
onTriggered: check();
}
MouseArea {
id: mouseAreaTopZone
anchors { bottom: parent.top; horizontalCenter: parent.horizontalCenter}
width: 50; height: 50
hoverEnabled: true
onEntered: m_iNumHovered++;
onExited: m_iNumHovered--;
}
MouseArea {
id: mouseAreaDialog
anchors.fill: parent
hoverEnabled: true
onEntered: m_iNumHovered++;
onExited: m_iNumHovered--;
}
Rectangle {
id: rectGreen
width: 200; height: 100
anchors.centerIn: parent
color: "green"
Rectangle {
id: rectYellow
anchors.centerIn: parent
width: 50; height: 50
color: "yellow"
visible: false
}
MouseArea {
anchors.fill: parent
hoverEnabled: true
onEntered: { m_iNumHovered++; rectYellow.visible = true; }
onExited: { m_iNumHovered--; rectYellow.visible = false }
}
}
}