Hover вызывается непреднамеренно на первом MenuItem внутри меню в qml - PullRequest
0 голосов
/ 07 марта 2019

То, что происходит, это то, что у меня есть MenuItem, который я определяю фоном, как прямоугольник с MouseArea, чтобы придать этому MenuItem различную непрозрачность в зависимости от того, содержит ли область мышь или нажата.

Я собираюсь проиллюстрировать, что происходит.

Итак, я открываю Меню (с помощью кнопки), и, не находясь со стрелкой мыши внутри первого варианта, это происходит:

enter image description here

Код, использованный для этого примера, был

main.cpp

#include <QGuiApplication>
#include "dataloopwrapper.h"
#include "gfepanel/firmware.hh"
#include <QIcon>
#include <QtQml>
#include "qmltranslator.h"

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);
    app.setWindowIcon(QIcon(":/images/iconapp.ico"));
    qmlRegisterInterface<GFEPanel::ConnectorFile>("ConnectorFile");
    qmlRegisterInterface<GFEPanel::PanelLog>("PanelLog");
    qmlRegisterInterface<GFEPanel::PanelLog>("PanelLogEntry");
    qmlRegisterInterface<GFEPanel::BootloaderResponse>("BootloaderResponse");
    qmlRegisterInterface<GFEPanel::Firmware>("Firmware");
    //A QObject singleton type instance returned from a singleton type provider is owned by the QML engine. For this reason, the singleton type provider function should not be implemented as a singleton factory.
    qmlRegisterSingletonType<DataloopWrapper>("pt.gfe.connector", 1, 0, "DataloopWrapper",&DataloopWrapper::qmlInstance);
    //will register the c++ class type (derived from QObject) as the non-instantiable type with QML type system.
    qmlRegisterUncreatableType<GFEPanel::Bootloader>("pt.gfe.connector", 1, 0, "Bootloader", "Can't instantiate Bootloader");
    // Add font to project
    QFile res(":/fonts/Roboto-Regular.ttf");
    QFile res2(":/fonts/Roboto-Bold.ttf");

    if(!res.open(QIODevice::ReadOnly))
    {
        qDebug() << "not able to use roboto regular font";
    }
    if(!res2.open(QIODevice::ReadOnly))
    {
        qDebug() << "not able to use roboto bold font";
    }
    // Create an object to work with translations ...
    QQmlApplicationEngine engine;
    QmlTranslator qmlTranslator(&engine);
    app.installTranslator(qmlTranslator.getTranslator());
    // and register it as a context in Qml layer
    engine.rootContext()->setContextProperty("qmlTranslator", &qmlTranslator);
    engine.load(QUrl(QLatin1String("qrc:/main.qml")));
    return app.exec();
}

main.qml

import QtQuick 2.9
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.3
ApplicationWindow {
    id: window
    title: "Stack"
    visible: true
    height: 200
    width: 400
    Item {
        id: page
        anchors.fill: parent
        width:parent.width
        height: parent.height
        Button {
            id: button
            anchors {
                top: parent.top
                left: parent.left
            }
            text: "open Menu"
            width: 100
            height: 30
            onClicked: menu.open()
        }

        Menu {
            id: menu
            y: 30
            MenuItem {
                background:
                    Rectangle {
                        anchors.fill: parent
                        color: "#999"
                        opacity: mouseArea1.pressed ? 1: mouseArea1.containsMouse ? 0.6 : 0.0
                        MouseArea {
                            id: mouseArea1
                            anchors.fill: parent
                            hoverEnabled: true
                        }
                    }
                text: "Cut"
            }
            MenuItem {
                background:
                    Rectangle {
                        anchors.fill: parent
                        color: "#999"
                        opacity: mouseArea2.pressed ? 1: mouseArea2.containsMouse ? 0.6 : 0.0
                        MouseArea {
                            id: mouseArea2
                            anchors.fill: parent
                            hoverEnabled: true
                        }
                    }
                text: "Copy"
            }
            MenuItem {
                background:
                    Rectangle {
                        anchors.fill: parent
                        color: "#999"
                        opacity: mouseArea3.pressed ? 1: mouseArea3.containsMouse ? 0.6 : 0.0
                        MouseArea {
                            id: mouseArea3
                            anchors.fill: parent
                            hoverEnabled: true
                        }
                    }
                text: "Paste"
            }
        }
    }
}

В чем может быть проблема, или есть обходной путь?

1 Ответ

0 голосов
/ 11 марта 2019

Я не знаю, почему первый элемент завис при открытии меню.

Но в качестве обходного пути вы можете сделать что-то вроде этого:

onClicked: {
    mouseArea1.hoverEnabled = false
    menu.open()
    mouseArea1.hoverEnabled = true
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...