Как я могу вызвать пользовательский сигнал от компонента QML? - PullRequest
0 голосов
/ 08 сентября 2018

Есть ли способ вызвать сигнал от mouseArea, включенного в компонент, который загружен где-то еще?

onClicked в приведенном ниже примере не вводится, когда я нажимаю на прямоугольник.

Структура должна оставаться такой, как определено. Чтобы можно было определить компонент qml, который применяет тень к любому источнику

Вот код:

Window{
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Item
    {
        id: mainRectangle
        anchors.centerIn: parent
        width: loaderId.width + 60
        height: loaderId.height + 60

        Rectangle {
            id: rect2
            anchors.right: mainRectangle.right
            anchors.top: mainRectangle.top
            anchors.rightMargin: -30
            anchors.topMargin: -30
            width: 100
            height: 100
            color: "red"
            opacity: 0.5
        }

        Loader {
            id: loaderId
            anchors.centerIn: parent
            sourceComponent: component
            active:true
        }
        visible: false
    }

    ShaderEffectSource {
        id: shader
        anchors.fill: mainRectangle
        anchors.margins: -30
        sourceItem: mainRectangle
        opacity: 0.5
        visible: true
    }

    Component {
        id: component
        Rectangle {
            id: rect
            width: 100
            height: 100
            color: "black"
            MouseArea {
                anchors.fill: parent
                onClicked: {
                    console.log("Clicked!")
                    // call a signal from here
                }
            }
        }
    }
}

В конце должен показать, что он делает сейчас, и область мыши должна работать.

1 Ответ

0 голосов
/ 08 сентября 2018

onЩелкнуто в приведенном ниже примере не вводится при нажатии на прямоугольник.

mainRectangle не отображается, а элементы, которые не отображаются, не получают входные события. Поскольку MouseArea является потомком mainRectangle, он также не получит события.

В конце должен показать, что он делает сейчас, и область мыши должна работать.

Вместо того, чтобы скрывать исходный элемент и использовать ShaderEffectSource, вы можете установить opacity непосредственно на mainRectangle и использовать слои элементов (ссылка имеет аналогичный пример), чтобы обеспечить наличие нет перекрытия из-за прозрачности:

import QtQuick 2.0
import QtQuick.Window 2.0

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Item {
        id: mainRectangle
        anchors.centerIn: parent
        width: loaderId.width + 60
        height: loaderId.height + 60
        opacity: 0.5
        layer.enabled: true

        Rectangle {
            id: rect2
            anchors.right: mainRectangle.right
            anchors.top: mainRectangle.top
            anchors.rightMargin: -30
            anchors.topMargin: -30
            width: 100
            height: 100
            color: "red"
        }

        Loader {
            id: loaderId
            anchors.centerIn: parent
            sourceComponent: component
            active: true
        }
    }

    Component {
        id: component
        Rectangle {
            id: rect
            width: 100
            height: 100
            color: "black"
            MouseArea {
                anchors.fill: parent
                onClicked: {
                    console.log("Clicked!")
                    // call a signal from here
                }
            }
        }
    }
}
...