Как я могу вызвать собственный сигнал из компонента QML?

Есть ли способ вызвать сигнал из 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
                }
            }
        }
    }
}

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


person Mihai    schedule 08.09.2018    source источник
comment
Пожалуйста, предоставьте код, который действительно работает.   -  person Mitch    schedule 09.09.2018
comment
Добавьте сигнал, который вы хотите запустить, в корневой элемент, rect в вашем случае. Например signal mySignal() и так назовите его откуда нужно root.mySignal()   -  person folibis    schedule 09.09.2018
comment
Это не сработает, пока MouseArea не отображается и, следовательно, не получает событий.   -  person Mitch    schedule 09.09.2018
comment
Удалось сделать это с помощью layer.enabled и layer.effect. @Mitch, хотите ли вы добавить решение, потому что вы указали на него. Спасибо :)   -  person Mihai    schedule 10.09.2018
comment
Хорошо, дайте мне знать, правильно ли я понял. У меня нет эффекта, поэтому в ответе его не используют.   -  person Mitch    schedule 10.09.2018


Ответы (1)


arrow_upward
0
arrow_downward

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

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

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

Вместо того, чтобы скрывать исходный элемент и использовать 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
                }
            }
        }
    }
}
person Mitch    schedule 08.09.2018
comment
Я отредактировал код. Там также есть тень, которую нужно применить, и если я не установлю непрозрачность с помощью шейдера, цвета будут смешаны (тень будет видна за загруженным компонентом). - person Mihai; 08.09.2018