Generic QML ListView that can be created to reference different instances of a c++ data class.
-
I have a QtQuick 2 application with a c++ back end. The app needs to display various different lists with the data being processed in the c++. I have a c++ class that handles everything to do with the lists (a load of link lists) and passes QML a QList of strings to display in each list. If the user presses key 2 the 2nd item in the list is found by the c++ and the relevant list is displayed by the QML etc.
I need to be able to make this generic. Obviously in the c++ I just create multiple versions of my object holding the differing data (the app loads different addons to do different things and each would need its own version of the c++ class). So, do I get each addon to pass each instance to QML with the same name ("menuManager")? If so how would the QML differentiate between A:menuManager, B:menuManager, C:menuManager? My assumption is that passing B would lose the reference to A.
How can I make the code generic so I can reference A, B, C without either of them knowing about the other (separate dll's). If I call the code below from the main.qml in A, B and C as a component how can I associate each with the correct c++ so I get the same functionality with each but from different source data. (The application will flip between A, B and C so not reloading things is best).
@
import QtQuick 2.0Rectangle
{
id: theMenu
property double fontSize: menuManager.menuFontPointSize
property double menuWidth: menuManager.menuWidth
property string menuTitle: menuManager.menuTitle
property double menuItemHeight: 0Component { id: menuEntryDelegate Rectangle { id: menuItemContainer width: menuEntry.width height: menuEntry.height * 1.25 property double fontSize: theMenu.fontSize property double menuWidth: theMenu.menuWidth property double menuItemHeight: theMenu.menuItemHeight//TBD - listview needs the height state: ListView.isCurrentItem ? "selected" : "notselected" Text { id: menuEntry font.pointSize: fontSize width: menuWidth wrapMode: Text.WordWrap text: displayText clip: true } states: [ State { name: "selected" PropertyChanges { target: menuItemContainer color: "#FAFCD9" }
...
...
]} } Rectangle { id: menuContainer width:theMenu.menuWidth height: parent.height anchors.horizontalCenter: parent.horizontalCenter anchors.top: parent.top property string menuTitle: theMenu.menuTitle ListView { id: menuHolder model: menuModel anchors.fill: parent opacity: 1 clip: true property string menuTitle: "" header: Rectangle { width: menuHolder.width height: 50 color: "#2A51A3" Text { id: header anchors.centerIn: parent text: menuTitle//menuManager.menuTitle font.pointSize: menuManager.menuFontPointSize color: "white" wrapMode: Text.WordWrap } } delegate: menuEntryDelegate focus: true Keys.onPressed: { ...... //Ways to select a menu item else if((event.key >= Qt.Key_1 && event.key <= Qt.Key_9) || event.key === Qt.Key_Return || event.key === Qt.Key_Enter) { if(event.key >= Qt.Key_1 && event.key <= Qt.Key_9) { menuHolder.currentIndex = event.key - Qt.Key_1; } menuManager.displayMenu(menuHolder.currentIndex); theMenu.fontSize = menuManager.menuFontPointSize } } } }
}
@