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.0
Rectangle
{
id: theMenu
property double fontSize: menuManager.menuFontPointSize
property double menuWidth: menuManager.menuWidth
property string menuTitle: menuManager.menuTitle
property double menuItemHeight: 0
Component
{
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
}
}
}
}
}
↧