QML Custom Button не может генерировать нажатый сигнал, потому что это не функция? - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь реализовать пользовательскую кнопку с функциями press() и release(), которые я вызываю при получении ожидаемого ключевого события. В этих функциях вызываются сигналы pressed() и released(). released() работает отлично, но при вызове pressed() отображается ошибка:

TypeError: Property 'pressed' of object CustomButton_QMLTYPE_3(0x78214d8) is not a function

Моя теория состоит в том, что QML не может дифференцировать свойство bool pressed кнопки и сигнал pressed(). Это ошибка или я делаю что-то не так? Вот что я сделал:

Это qml-файл пользовательской кнопки:

import QtQuick 2.10
import QtQuick.Controls 2.12

Button {
    id: control

    function press() {
        down = true;
        pressed();
    }

    function release() {
        down = false;
        released()
    }
}

В приведенном ниже примере, когда клавиша F3 нажата или отпущена, я вызываю функции кнопки и ожидаю их чтобы прийти к Соединениям, которые я сделал.

 CustomButton {
        id: customButton
        width: parent.width
        height: parent.height

        Connections {
            target: customButton
            onPressed: {
                console.log("Custom button pressed!\n");
            }

            onReleased: {
                console.log("Custom button released!\n")
            }
        }
    }

    focus: true
    Keys.onPressed: {
        if(event.key === Qt.Key_F3 && !event.isAutoRepeat) {
            console.log("F3 Key pressed!")
            customButton.press()
        }
    }

    Keys.onReleased: {
        if(event.key === Qt.Key_F3 && !event.isAutoRepeat) {
            console.log("F3 Key released!")
            customButton.release()
        }
    }

Как я уже говорил, релиз работает, но пресса проблематична c. Я вижу эти строки в консоли:

qml: F3 Key pressed!
qml: press function called
file:///D:/Projects/QmlExamples/qml/fxMenu/button/CustomButton.qml:10: TypeError: Property 'pressed' of object CustomButton_QMLTYPE_3(0x78214d8) is not a function
qml: F3 Key released!
qml: release function called
qml: Custom button released!

1 Ответ

1 голос
/ 02 марта 2020

Если вы хотите вручную генерировать нажатый сигнал, объявите его в своем объекте Button:

Button {
    id: control
    signal pressed;
    signal released;

    function press() {
        down = true;
        pressed();
    }

    function release() {
        down = false;
        released()
    }

    onPressedChanged:  {
        if (down) {
            release();
        } else {
            press();
        }
    }
}

Как вы упомянули, есть также булево свойство с именем "selected", поэтому похоже, что механизм QML не признать ваши намерения.

...