В настоящее время у меня есть ListModel, определенный в QML со многими различными полями в каждом 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 завершен, я прочитал некоторые значения конфигурации из класса C ++ под названием «Config».
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 ++?
Хороший способ создать мощные модели данных в 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 для получения дополнительной информации о реализации
Похоже на использование QQmlListProperty, как описано в http://doc.qt.io/qt-5/qtqml-cppintegration-exposecppattributes.html#properties-with-object-list-types было бы хорошо подходит для вашей модели.
И если вы все еще находитесь на Qt 4.8, вероятно, будет работать QList вашего собственного класса, производного от QObject. Более подробную информацию об этом можно найти в: http://doc.qt.io/qt-4.8/qdeclarativemodels.html#c-data-models.