How to use a C class declared in a namespace with Q PROPERTY and QML/bg
Български English
[toc align_right="yes" depth="2"]
Как да използваме C++ клас, деклариран в именно пространство(namespace) с Q_PROPERTY и QML
Използването на C++ клас, деклариран в именно пространство в QML в общи линии работи без никакъв проблем. Всичко, което трябва да направите е да се уверите, че сте регистрирали класа за употреба в QML с "qmlRegisterType()":http://doc.qt.nokia.com/latest/qdeclarativeengine.html#qmlRegisterType. Когато обаче, трябва да се обърнете към клас от дадено пространство в "Q_PROPERTY":http://doc.qt.nokia.com/latest/qobject.html#Q_PROPERTY , има няколко неща, на които трябва да обърнете внимание, за да работят в QML. Примерът отдолу показва стъпките, който трябва да предприемете.
Прост пример
Долният пример се състои от 2 класа, декларирани в именно пространство:
MyNamespace::Person<br />PartyNamespace::BirthdayParty
Класът Person се използва в Q_PROPERTY декларация на класа BirthdayParty. За да може QML кода да работи правилно, името на пространството трябва да се включи, когато се обръщаме към класа Person в декларацията на Q_PROPERTY и в съответните прототипи на функциите за четене и писане и също така в прототипите на функциите с флаг "Q_INVOKABLE":http://doc.qt.nokia.com/latest/qobject.html#Q_INVOKABLE . За да обобщим, C++ няма такива ограничения; достатъчно е декларациите на класа да са в именното пространство и няма нужда да се използват имената на пространствата. Има създадена "Jira":https://bugreports.qt.nokia.com/browse/QTBUG-15459 за подобряване на документацията за този проблем.
C++ имплементация
В C++ кода по-долу ние си подсигуряваме, че пространството MyNamespace е написано пред името на класа Person във функциите за четене и писане на класа BirthdayParty:
main.cpp
<br />#include <QtGui&gt;<br />#include <QtDeclarative&gt;
namespace MyNamespace {<br /> class Person : public QObject<br /> {<br /> Q_OBJECT<br /> Q_PROPERTY(QString name READ name WRITE setName)<br /> public:<br /> Person()<br /> {}
QString name() const<br /> {<br /> return m_name;<br /> }<br /> void setName(const QString & n)<br /> {<br /> m_name = n;<br /> }
private:<br /> QString m_name;<br /> };<br />}
namespace PartyNamespace {<br /> class BirthdayParty : public QObject<br /> {<br /> Q_OBJECT<br /> Q_PROPERTY(MyNamespace::Person *host READ host WRITE setHost)<br /> Q_PROPERTY(QDeclarativeListProperty&lt;MyNamespace::Person&gt; guests READ guests)<br /> public:<br /> BirthdayParty()<br /> {}
MyNamespace::Person *host() const<br /> {<br /> return m_host;<br /> }<br /> void setHost(MyNamespace::Person *c)<br /> {<br /> m_host = c;<br /> }
QDeclarativeListProperty&lt;MyNamespace::Person&gt; guests()<br /> {<br /> return QDeclarativeListProperty&lt;MyNamespace::Person&gt;(this, m_guests);<br /> }
private:<br /> MyNamespace::Person '''m_host;<br /> QList&lt;MyNamespace::Person'''> m_guests;<br /> };<br />}
#include "main.moc&quot;
using namespace MyNamespace;<br />using namespace PartyNamespace;
int main(int argc, char** argv)<br />{<br /> QApplication app(argc, argv);
qmlRegisterType&lt;Person&gt;("People&quot;, 1, 0, "Person&quot;);<br /> qmlRegisterType&lt;BirthdayParty&gt;("People&quot;, 1,0, "BirthdayParty&quot;);
MyNamespace::Person myObj;<br /> PartyNamespace::BirthdayParty myParty;
QDeclarativeView view;<br /> view.setSource(QUrl::fromLocalFile&amp;#40;"main.qml&quot;&#41;);<br /> view.resize(200,100);<br /> view.show();<br /> return app.exec&amp;#40;&#41;;<br />}
QML имплементация
Примерният код по-долу показва как се използват класовете от именното пространство в QML
main.qml
<br />import People 1.0<br />import QtQuick 1.0
Text {<br /> text: "Party people: " ''myPerson.name''" " + person1.name + " " + person2.name<br /> BirthdayParty {<br /> id: myParty;<br /> host: Person {<br /> id: myPerson<br /> name: "Sigurd&quot;
}<br /> guests: [<br /> Person { id: person1; name: "Jakob&quot; },<br /> Person { id: person2; name: "Dani&quot; }<br /> ]<br /> }<br />}