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
и слот прикреплен к нему.