QML: подключить слот к нескольким элементам управления

Я хотел бы получить уведомление в основном приложении Qt в случае, если какой-либо элемент управления в QML (загружается через QQuickWidget) меняет свою стоимость. Есть CheckBox"Ы, ComboBox"Ы, SpinBoxи TextEditor"S. Мой текущий подход заключается в объявлении слота для каждого элемента управления (onCheckedChanged, onCurrentIndexChanged, onValueChanged а также onTextChanged соответственно) и звоните mainApp.notifyMe() от них там mainApp ссылка на родительский виджет Qt, распространяемая в QML с помощью

QQmlEngine* engine = new QQmlEngine(this);
if (QQmlContext* cntx = engine->rootContext()) {
            cntx->setContextProperty("mainApp", this);
}

а также notifyMe() это слот в нем на стороне C++.

Но для этого нужны десятки функций с одинаковым кодом, так как у меня десятки элементов управления. Было бы идеально иметь одну или 4 функции с notifyMe() в QML, которые могли бы быть связаны со всеми изменениями значений элементов управления.

Есть ли способ в QML создать такой слот и подключить его к нескольким изменениям свойств объектов?

1 ответ

В итоге я получил следующее в моем корневом элементе:

MySettingsForm {

    signal notify()

    onNotify: {
        mainApp.notifyMe();
    }

    Component.onCompleted: {
        var cbs = [Combobox1, Combobox2, Combobox3];
        for (var i in cbs) {
            cbs[i].checkedChanged.connect(notify);
        }
        var sbs = [SpinBox1, SpinBox2, SpinBox3];
        for (i in sbs) {
            sbs[i].valueChanged.connect(notify);
        }
        var tes = [TextField1, TextFiel2, TextField3];
        for (i in tes) {
            tes[i].textChanged.connect(notify);
        }
        var cxs = [ComboBox1, ComboBox2, ComboBox3];
        for (i in cxs) {
            cxs[i].currentIndexChanged.connect(notify);
        }
    }
...
}

Хитрость в создании собственного сигнала notify и слот прикреплен к нему.

Другие вопросы по тегам