Partie 9: Informations dans l'éditeur
Téléchargements
Envoyer des données au QML
#define qmlMember(_type,_name) \
public: \
Q_PROPERTY(_type _name MEMBER m_##_name READ get_##_name WRITE set_##_name NOTIFY _name##Changed); \
_type get_##_name() const {return m_##_name;} \
void set_##_name(_type val) {m_##_name = val; emit _name##Changed(val);} \
private: \
_type m_##_name;
Comme vous pouvez le voir, on doit appeler "Q_PROPERTY" avec les paramètres suivants:
La position du curseur
qmlMember(QString,cursorInfo)
[...]
signals:
[...]
void cursorInfoChanged(QString);
Dans "MainForm.ui.qml" on l'affiche simplement dans un rectangle:
Rectangle {
id: rectangle
y: 446
height: cursorInfos.height + 8
color: "#00000000"
border.color: "#808080"
border.width: 1
[...]
Label {
id: cursorInfos
x: 0
text: bridge.cursorInfo
[...]
}
}
Et dans "rectangles.cpp", on modifie la variable à chaque fois qu'on dessine le curseur:
void Rectangles::drawCursor(QImage* image, CVec2 mousePos, ETabIndex tabIndex)
{
if (mousePos.x != -1)
{
if (tabIndex == eTabTiles)
drawTileRect(image, mousePos, CURSOR_COLOR);
else if (tabIndex == eTabWalls)
drawWallRect(image, mousePos, CURSOR_COLOR);
else if (tabIndex == eTabObjects)
drawObjectRect(image, mousePos, CURSOR_COLOR);
QString text = editor.getPositionString(mousePos, tabIndex);
bridge.set_cursorInfo(text);
}
else
{
bridge.set_cursorInfo(QString());
}
}
Les informations de la sélection
GroupBox {
id: selectionBox
x: 403
width: tabView1.width
[...]
title: qsTr("Sélection")
ScrollView {
id: tileSelScroll
visible: bridge.tileSelScrollVis
anchors.fill: parent
Grid {
id: tSelGrid
spacing: 4
rows: 3
columns: 2
anchors.fill: parent
[...]
}
}
ScrollView {
id: wallSelScroll
visible: bridge.wallSelScrollVis
anchors.fill: parent
Grid {
id: wSelGrid
spacing: 4
rows: 3
columns: 2
anchors.fill: parent
[...]
}
}
ScrollView {
id: objectSelScroll
visible: bridge.objectSelScrollVis
anchors.fill: parent
Grid {
id: oSelGrid
spacing: 4
rows: 3
columns: 2
anchors.fill: parent
[...]
}
}
ScrollView {
id: rectSelScroll
visible: bridge.rectSelScrollVis
anchors.fill: parent
Grid {
id: rSelGrid
spacing: 4
rows: 3
columns: 2
anchors.fill: parent
[...]
}
}
}
Comme vous le voyez, chaque ScrollView peut être affichée ou cachée en modifiant la variable correspondante: tileSelScrollVis, wallSelScrollVis,
Label {
id: tPosLabel
height: 20
text: qsTr("Position:")
verticalAlignment: Text.AlignVCenter
renderType: Text.QtRendering
}
Label {
id: tPosValue
height: 20
text: bridge.selPosition
verticalAlignment: Text.AlignVCenter
}
Cette position est définie par la même fonction getPositionString() qu'on a utilisée auparavant.
Les ComboBox
Label {
id: tTypeLabel
height: 20
text: qsTr("Type:")
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignLeft
}
ComboBox {
id: tTypeValue
model: tilesList
currentIndex: bridge.selTileType
}
Le "model" représente toutes les valeurs qui seront affichées dans la ComboBox. C'est une liste de chaines de caractères qui est définie par la fonction
// enregistre nos fonctions
ctxt = engine.rootContext();
editor.initLists();
ctxt->setContextProperty("bridge", &bridge);
ctxt->setContextProperty("tilesList", QVariant::fromValue(bridge.tilesList));
ctxt->setContextProperty("wallsList", QVariant::fromValue(bridge.wallsList));
Le "currentIndex" est la variable qu'on va utiliser pour définir le type de l'élément sélectionné du coté C++.
tTypeValue.onCurrentIndexChanged: bridge.setSelTileType(tTypeValue.currentIndex);
wTypeValue.onCurrentIndexChanged: bridge.setSelWallType(wTypeValue.currentIndex);
Vous pourrez voir comment ces valeurs sont gérées dans le code C++ en cherchant les variables et les fonction correspondantes.