Néhány problémás szituáció, amire mi az alábbi megoldásokat találtuk
QList vs. QStringList
QList<QString>
nem ugyanaz mint QStringList
és baromira nem fog működni ListView
-val QML-ben.
Részletesen: ha valaki nem csak állapot objektumból akar listát, hanem simán stringek listáját kiíratni QML oldalon, akkor a logikussal ellentétben nem QList
adattípusát kell megváltoztatni QString
-re, hanem az egészet QListString
-re cserélni, mert minden hiba nélkül fog úgy is fordulni, csak nem csinál semmit.
Delegateben ha a QStringList
tartalmát akarod kiíratni, akkor nem model
-re kell hivatkozni, hanem modelData
-ra.
QML Property változtatása kódból
Amennyiben QML object propertyjét akarjuk futásidőben változtatni, először az adott objecthez adjunk egy olyan propertyt, hogy objectName
, mert csak ez alapján lesz kereshető c++-ből. Ezek után (az STV-t alapul véve) az EventHandler
osztályba adjuk meg slotokat, amiket triggerelve akarjuk végezni a property módosításokat, adjunk hozzá egy QList<QObject*>rootObjects
változót és a hozzá tartozó set függvényt. Innentől a korábban definiált slot függvényekben megírhatjuk a propertymódosításokat a következő módon:
Először a következő sorral megszerezzük a keresett objektumot:
QQuickItem *item2 = rootObjects.at(0)->findChild<QQuickItem*>("objectnamehere");
Ezután egy if-el ellenőrizzük valid objektumot kaptunk-e vagy null-t és állítsuk be a propertyt:
item2->setProperty("color", color);
Mindenképpen állítsuk be a rootObjects
-et a publikus set függvényét hívva az application osztályban a rootObjects
-et átadva
QML felületről szöveg (vagy más szövegesen megadható adat pl double) beolvasása:
Dokumentációban nagyon sokféle szövegbeviteli mezőt lehet találni, tapasztalat alapján a legjobb ezek közül a TextField. Kiemelten hasznos, hogy adható hozzá validator, azaz csak megadott feltételek teljesülése esetén fog elsülni az onAccepted
, rossz bevitt adat esetén nem. Fontos a validatornál a locale:"en"
vagy "hu"
beállítása az ominózus . vagy , kérdés miatt. onAccepted
-hez adjunk meg egy függvényt átadva neki a textfield.text
-et. Legyen ennek a függvénynek a neve: acceptedTextField. A main.qml-ben adjunk hozzá egy új signalt acceptedTextFieldCpp(string msg)
formában, majd az eseménykezelő továbbhívásoknál az alábbiakat:
onAcceptedTextField:{acceptedTextFieldCpp(msg);}
C++ oldalon (praktikusan az event handler osztályban) definiáljunk egy void doThings(QString);
slot-ot, amihez az application osztályban hozzákötjük az acceptedTextFieldCpp
-t, mindkettőnél kiírva a (QString)
paramétert. Már csak implementálni kell a doThings-t és használhatjuk is a string-ként megkapott adatot.
QML szebb design készítése
A QML tartalmaz előre definiált design-okat, melyeket szabadon használhatunk. Ennek következtében az alkalmazás felülete sokkal inkább modernnek tűnik, és nem az alapértelmezett Windows-os elemeket használja. Ezek a stílusok közül, mi az Imagine nevezetűt használtuk. Erről részletesebben itt lehet olvasni:
Imagine Style
A téma alkalmazásához nem kell mást tennünk, mint a main.cpp fájl-ba a main
függvénybe alábbi sorokat beszúrni:
#include <QQuickStyle>
QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QQuickStyle::setStyle("Imagine");
Fontos, ennek még az Application
példányosítása előtt meg kell történnie.
Előfordulhat, hogy a QTCreator a fenti include-ot nem fogja tudni értelmezni. Ilyenkor annyit kell tenni, hogy beszúrjuk a következő sort a project (.pro) fájlba:
QT += quickcontrols2
Ezután egy Rebuild All, és nem fog többet hibát jelezni.
A részletes leírást a stílusokról és a többi stíluslapokról itt lehet elolvasni.