How to use a C class declared in a namespace with Q PROPERTY and QML/bg

From Qt Wiki
Jump to navigation Jump to search



Български 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&quot;:http://doc.qt.nokia.com/latest/qobject.html#Q_INVOKABLE . За да обобщим, C++ няма такива ограничения; достатъчно е декларациите на класа да са в именното пространство и няма нужда да се използват имената на пространствата. Има създадена "Jira&quot;:https://bugreports.qt.nokia.com/browse/QTBUG-15459 за подобряване на документацията за този проблем.

C++ имплементация

В C++ кода по-долу ние си подсигуряваме, че пространството MyNamespace е написано пред името на класа Person във функциите за четене и писане на класа BirthdayParty:

main.cpp

<br />#include &lt;QtGui&amp;gt;<br />#include &lt;QtDeclarative&amp;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 &amp; 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&amp;lt;MyNamespace::Person&amp;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&amp;lt;MyNamespace::Person&amp;gt; guests()<br /> {<br /> return QDeclarativeListProperty&amp;lt;MyNamespace::Person&amp;gt;(this, m_guests);<br /> }

private:<br /> MyNamespace::Person '''m_host;<br /> QList&amp;lt;MyNamespace::Person'''&gt; m_guests;<br /> };<br />}

#include &quot;main.moc&amp;quot;

using namespace MyNamespace;<br />using namespace PartyNamespace;

int main(int argc, char** argv)<br />{<br /> QApplication app(argc, argv);

qmlRegisterType&amp;lt;Person&amp;gt;(&quot;People&amp;quot;, 1, 0, &quot;Person&amp;quot;);<br /> qmlRegisterType&amp;lt;BirthdayParty&amp;gt;(&quot;People&amp;quot;, 1,0, &quot;BirthdayParty&amp;quot;);

MyNamespace::Person myObj;<br /> PartyNamespace::BirthdayParty myParty;

QDeclarativeView view;<br /> view.setSource(QUrl::fromLocalFile&amp;amp;#40;&quot;main.qml&amp;quot;&amp;#41;);<br /> view.resize(200,100);<br /> view.show();<br /> return app.exec&amp;amp;#40;&amp;#41;;<br />}

QML имплементация

Примерният код по-долу показва как се използват класовете от именното пространство в QML

main.qml

<br />import People 1.0<br />import QtQuick 1.0

Text {<br /> text: &quot;Party people: &quot; ''myPerson.name''&quot; &quot; + person1.name + &quot; &quot; + person2.name<br /> BirthdayParty {<br /> id: myParty;<br /> host: Person {<br /> id: myPerson<br /> name: &quot;Sigurd&amp;quot;

}<br /> guests: [<br /> Person { id: person1; name: &quot;Jakob&amp;quot; },<br /> Person { id: person2; name: &quot;Dani&amp;quot; }<br /> ]<br /> }<br />}