【问题标题】:QML: connect slot to several controlsQML:将插槽连接到多个控件
【发布时间】:2018-07-25 19:11:06
【问题描述】:

如果 QML 中的任何控件(通过QQuickWidget 加载)更改其值,我想在主 Qt 应用程序中获得通知。有CheckBox'es、ComboBox'es、SpinBox'es 和TextEditor's。 我目前的方法是为每个控件声明一个插槽(分别为onCheckedChangedonCurrentIndexChangedonValueChangedonTextChanged)并从它们那里调用mainApp.notifyMe()mainApp 是一个指向父 Qt Widget 的链接传播到QML 在

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

notifyMe() 是 C++ 端的一个插槽。

但这需要使用相同代码的几十个函数,因为我有几十个控件。在 QML 中拥有一个或 4 个带有 notifyMe() 的函数将是理想的,这些函数可以连接到所有控件的值更改。

QML 中有没有办法创建这样的插槽并将其连接到多个对象的属性更改?

【问题讨论】:

  • 对于特定于信号类型的代码将没有转义,即一个函数如何循环具有onCurrentIndexChanged的所有控件并连接到插槽

标签: qt qml qtquick2


【解决方案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 并附加到它的插槽。

【讨论】:

    猜你喜欢
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    相关资源
    最近更新 更多