1

我有一个 QML 应用程序和 MouseAreas 的问题。

在一个小型测试应用程序中,有一个红色矩形,当鼠标进入这个矩形时,下面会出现一个灰色菜单(使用 Loader 创建)。

此灰色菜单必须在鼠标悬停在红色矩形或菜单上时打开。为此,我有 2 个鼠标区域,1 个在红色矩形上,1 个在菜单上。两者都是 'hoverEnabled' 和 'enter' 和 'exit' 我控制 'hoverDialog' 和 'hoverTopZone'。

当两者都为假时,这意味着鼠标不在,所以我关闭了菜单(使用信号,加载器处于非活动状态)。

计时器是必需的,因为当从“mouseAreaTopZone”传递到“mouseAreaDialog”时,“hoverDialog”和“hoverTopZone”都是错误的。用定时器固定。

在菜单的中间有一个绿色的矩形,并且(仅)当鼠标在那里时,一个黄色的矩形必须是可见的。

有我的问题。我在绿色矩形中有一个 MouseArea,但在需要时黄色矩形不可见。

如果我将“rectGreen”移动到“mouseAreaTopZone”和“mouseAreaDialog”下方(即在文件末尾),当鼠标位于绿色矩形上方时,我会看到黄色矩形,因为它的鼠标区域是“最顶部”

但是在这种情况下,菜单对话框已关闭,因为当鼠标进入绿色矩形内的 MouseArea 时,hoverDialog 和 hoverTopZone 为假...

我希望你能理解我的问题......这是我的代码:

测试.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;
        }
    }
}

测试菜单.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(); }
    }
}

在此先感谢,迭戈

4

1 回答 1

0

感谢马克 Ch 的帮助。

我需要在鼠标退出时关闭对话框,所以我认为我不能使用“弹出”控件...

我解决了这个问题。只使用一个变量来知道鼠标是否在我的对话框上('m_iNumHovered'),我每次进入鼠标区域时添加一个引用,并在退出时减少它。关键是在绿色矩形上的 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 }
       }
    }
}
于 2017-07-16T20:44:23.493 回答