【问题标题】:QML - best way to implement C++ ListModelQML - 实现 C++ ListModel 的最佳方式
【发布时间】:2015-11-21 02:34:57
【问题描述】:

目前我在 QML 中定义了一个 ListModel,每个 ListElement 中有许多不同的字段。委托根据“myType”值以不同的方式做出反应。

ListView {
        id: createLocalGameViewList
        anchors.fill: parent
        model: ListModel {
            id: createLocalGameViewModel
            ListElement {
                myId: "comboBox_NumberOfPlayers"
                myTitle: qsTr("Number of players")
                myType: "ComboBox"
                myValuesList: [
                    ListElement { value: "10" },
                    ListElement { value: "9" },
                    ListElement { value: "8" },
                    ListElement { value: "7" },
                    ListElement { value: "6" },
                    ListElement { value: "5" },
                    ListElement { value: "4" },
                    ListElement { value: "3" },
                    ListElement { value: "2" }
                ]
                myValueIsIndex: false
                myValue: ""
            }
            ListElement {
                myId: "spinBox_StartCash"
                myTitle: qsTr("Start cash")
                myType: "SpinBox"
                myMaxValue: "1000000"
                myMinValue: "1000"
                myPrefix: "$"
                myValue: ""
            }
            ListElement {
                myId: "spinBox_StartBlind"
                myTitle: qsTr("Start blind")
                myType: "SpinBox"
                myMaxValue: "20000"
                myMinValue: "5"
                myPrefix: "$"
                myValue: ""
            }                
            ListElement {
                myId: "selector_BlindsRaiseInterval"
                myTitle: qsTr("Blinds raise interval")
                myType: "BlindsRaiseInterval"
                myRaiseOnHandsType: "" //if false it is raise on minutes type
                myRaiseOnHandsInterval: ""
                myRaiseOnMinutesInterval: ""
            }
            ListElement {
                myId: "selector_BlindsRaiseMode"
                myTitle: qsTr("Blinds raise mode")
                myType: "BlindsRaiseMode"
                myAlwaysDoubleBlinds: "" //if false it is "Manual Blinds Order"
                myManualBlindsList: []
                myAfterMBAlwaysDoubleBlinds: ""
                myAfterMBAlwaysRaiseAbout: ""
                myAfterMBAlwaysRaiseValue: ""
                myAfterMBStayAtLastBlind: ""
            }
            ListElement {
                myId: "comboBox_GameSpeed"
                myTitle: qsTr("Game speed")
                myType: "ComboBox"
                myValuesList: [
                    ListElement { value: "11" },
                    ListElement { value: "10" },
                    ListElement { value: "9" },
                    ListElement { value: "8" },
                    ListElement { value: "7" },
                    ListElement { value: "6" },
                    ListElement { value: "5" },
                    ListElement { value: "4" },
                    ListElement { value: "3" },
                    ListElement { value: "2" },
                    ListElement { value: "1" }
                ]
                myValue: ""
                myValueIsIndex: false
            }

ListView 组件完成后,我从名为“Config”的 C++ 类中读取了一些配置值。

            Component.onCompleted: {
                //set Config Values from config file
                createLocalGameViewModel.setProperty(0, "myValue", Config.readConfigIntString("NumberOfPlayers"));
                createLocalGameViewModel.setProperty(1, "myValue", Config.readConfigIntString("StartCash"));
                createLocalGameViewModel.setProperty(2, "myValue", Config.readConfigIntString("FirstSmallBlind"));
                createLocalGameViewModel.setProperty(3, "myRaiseOnHandsType", Config.readConfigIntString("RaiseBlindsAtHands"));
                createLocalGameViewModel.setProperty(3, "myRaiseOnHandsInterval", Config.readConfigIntString("RaiseSmallBlindEveryHands"));
                createLocalGameViewModel.setProperty(3, "myRaiseOnMinutesInterval", Config.readConfigIntString("RaiseSmallBlindEveryMinutes"));
                createLocalGameViewModel.setProperty(4, "myAlwaysDoubleBlinds", Config.readConfigIntString("AlwaysDoubleBlinds"));

                var tempList = Config.readConfigIntStringList("ManualBlindsList");
                for(var i=0; i < tempList.length; i++) {
                    createLocalGameViewModel.get(4).myManualBlindsList.append({"blindValue": tempList[i].toString()})
                }

                createLocalGameViewModel.setProperty(4, "myAfterMBAlwaysDoubleBlinds", Config.readConfigIntString("AfterMBAlwaysDoubleBlinds"));
                createLocalGameViewModel.setProperty(4, "myAfterMBAlwaysRaiseAbout", Config.readConfigIntString("AfterMBAlwaysRaiseAbout"));
                createLocalGameViewModel.setProperty(4, "myAfterMBAlwaysRaiseValue", Config.readConfigIntString("AfterMBAlwaysRaiseValue"));
                createLocalGameViewModel.setProperty(4, "myAfterMBStayAtLastBlind", Config.readConfigIntString("AfterMBStayAtLastBlind"));
                createLocalGameViewModel.setProperty(5, "myValue", Config.readConfigIntString("GameSpeed"));
            }

listView 完成后,我需要将编辑后的数据传递给 C++。所以我意识到这不是在 QML 中构建模型的最佳方式。所以我计划用 C++ 创建模型,但我以前从未这样做过。所以我的问题是:哪种模型结构最适合这个用例,但设置起来不太复杂?

或者有没有另一种不太难看的方式将 QML 模型中的数据放到 c++ 上下文中?

【问题讨论】:

    标签: c++ qml qtquick2 qabstractlistmodel


    【解决方案1】:

    似乎使用http://doc.qt.io/qt-5/qtqml-cppintegration-exposecppattributes.html#properties-with-object-list-types 中描述的 QQmlListProperty 将非常适合您的模型。

    如果你碰巧还在使用 Qt 4.8,你自己的 QObject 派生类的 QList 可能也可以工作。有关这方面的更多信息,请访问:http://doc.qt.io/qt-4.8/qdeclarativemodels.html#c-data-models

    【讨论】:

    • 我建议您考虑将 QAbstractItemModel 作为模型的基类,对吗?如何将 QQmlListProperty 集成到其中?
    • 你的模型看起来很简单,所以你不需要从 qabstractmodelitem 继承,只需使用一些 qobjects。后天我会给你一个代码示例
    【解决方案2】:

    在 Qt 中创建强大的数据模型的一个好方法是使用 QAbstractItemModel (http://doc.qt.io/qt-5/qabstractitemmodel.html) 我正在创建一个 Qt/QML 插件库,您可以基于:https://github.com/ThomArmax/QtArmax

    查看https://github.com/ThomArmax/QtArmax/tree/develop/src/core/datamodels了解更多实施信息

    【讨论】:

    • 对不起,我想我不能为我们的项目添加另一个依赖项......我的同事会杀了我-.-
    猜你喜欢
    • 2016-06-14
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 2021-12-23
    • 2014-03-10
    相关资源
    最近更新 更多