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

From Qt Wiki
Jump to navigation Jump to search
No edit summary
 
(Remove non-functioning "toc" command)
 
(5 intermediate revisions by 3 users not shown)
Line 1: Line 1:
[[Category:HowTo]]<br />[[Category:Developing_with_Qt::General]]<br />[[Category:Tutorial]]
{{Cleanup | reason=Auto-imported from ExpressionEngine.}}
 
[[Category:HowTo]]
[[Category:Developing_with_Qt::General]]
[[Category:Tutorial]]


'''Български''' [[:How_to_use_a_C_class_declared_in_a_namespace_with_Q_PROPERTY_and_QML|English]]
'''Български''' [[:How_to_use_a_C_class_declared_in_a_namespace_with_Q_PROPERTY_and_QML|English]]


[toc align_right=&quot;yes&amp;quot; depth=&quot;2&amp;quot;]


= Как да използваме C++ клас, деклариран в именно пространство(namespace) с Q_PROPERTY и QML =
= Как да използваме C++ клас, деклариран в именно пространство(namespace) с Q_PROPERTY и QML =


Използването на C++ клас, деклариран в именно пространство в QML в общи линии работи без никакъв проблем. Всичко, което трябва да направите е да се уверите, че сте регистрирали класа за употреба в QML с &quot;qmlRegisterType()&quot;:http://doc.qt.nokia.com/latest/qdeclarativeengine.html#qmlRegisterType. Когато обаче, трябва да се обърнете към клас от дадено пространство в &quot;Q_PROPERTY&amp;quot;:http://doc.qt.nokia.com/latest/qobject.html#Q_PROPERTY , има няколко неща, на които трябва да обърнете внимание, за да работят в QML. Примерът отдолу показва стъпките, който трябва да предприемете.
Използването на C++ клас, деклариран в именно пространство в QML в общи линии работи без никакъв проблем. Всичко, което трябва да направите е да се уверите, че сте регистрирали класа за употреба в QML с [http://doc.qt.nokia.com/latest/qdeclarativeengine.html#qmlRegisterType qmlRegisterType()]. Когато обаче, трябва да се обърнете към клас от дадено пространство в [http://doc.qt.nokia.com/latest/qobject.html#Q_PROPERTY Q_PROPERTY] , има няколко неща, на които трябва да обърнете внимание, за да работят в QML. Примерът отдолу показва стъпките, който трябва да предприемете.


== Прост пример ==
== Прост пример ==
Line 13: Line 16:
Долният пример се състои от 2 класа, декларирани в именно пространство:
Долният пример се състои от 2 класа, декларирани в именно пространство:


<code>MyNamespace::Person<br />PartyNamespace::BirthdayParty </code>
<code>MyNamespace::Person
PartyNamespace::BirthdayParty </code>


Класът ''Person'' се използва в Q_PROPERTY декларация на класа ''BirthdayParty''. За да може QML кода да работи правилно, името на пространството трябва да се включи, когато се обръщаме към класа ''Person'' в декларацията на Q_PROPERTY и в съответните прототипи на функциите за четене и писане и също така в прототипите на функциите с флаг &quot;Q_INVOKABLE&amp;quot;:http://doc.qt.nokia.com/latest/qobject.html#Q_INVOKABLE . За да обобщим, C++ няма такива ограничения; достатъчно е декларациите на класа да са в именното пространство и няма нужда да се използват имената на пространствата. Има създадена &quot;Jira&amp;quot;:https://bugreports.qt.nokia.com/browse/QTBUG-15459 за подобряване на документацията за този проблем.
Класът ''Person'' се използва в Q_PROPERTY декларация на класа ''BirthdayParty''. За да може QML кода да работи правилно, името на пространството трябва да се включи, когато се обръщаме към класа ''Person'' в декларацията на Q_PROPERTY и в съответните прототипи на функциите за четене и писане и също така в прототипите на функциите с флаг [http://doc.qt.nokia.com/latest/qobject.html#Q_INVOKABLE Q_INVOKABLE] . За да обобщим, C++ няма такива ограничения; достатъчно е декларациите на класа да са в именното пространство и няма нужда да се използват имената на пространствата. Има създадена [https://bugreports.qt.nokia.com/browse/QTBUG-15459 Jira] за подобряване на документацията за този проблем.


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


main.cpp<br /><code><br />#include &lt;QtGui&amp;gt;<br />#include &lt;QtDeclarative&amp;gt;
main.cpp
<code>
#include <QtGui>
#include <QtDeclarative>


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 /> {}
namespace MyNamespace {
class Person : public QObject
{
Q_OBJECT
Q_PROPERTY(QString name READ name WRITE setName)
public:
Person()
{}


QString name() const<br /> {<br /> return m_name;<br /> }<br /> void setName(const QString &amp; n)<br /> {<br /> m_name = n;<br /> }
QString name() const
{
return m_name;
}
void setName(const QString & n)
{
m_name = n;
}


private:<br /> QString m_name;<br /> };<br />}
private:
QString m_name;
};
}


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 /> {}
namespace PartyNamespace {
class BirthdayParty : public QObject
{
Q_OBJECT
Q_PROPERTY(MyNamespace::Person *host READ host WRITE setHost)
Q_PROPERTY(QDeclarativeListProperty<MyNamespace::Person> guests READ guests)
public:
BirthdayParty()
{}


MyNamespace::Person *host() const<br /> {<br /> return m_host;<br /> }<br /> void setHost(MyNamespace::Person *c)<br /> {<br /> m_host = c;<br /> }
MyNamespace::Person *host() const
{
return m_host;
}
void setHost(MyNamespace::Person *c)
{
m_host = c;
}


QDeclarativeListProperty&amp;lt;MyNamespace::Person&amp;gt; guests()<br /> {<br /> return QDeclarativeListProperty&amp;lt;MyNamespace::Person&amp;gt;(this, m_guests);<br /> }
QDeclarativeListProperty<MyNamespace::Person> guests()
{
return QDeclarativeListProperty<MyNamespace::Person>(this, m_guests);
}


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


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


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


int main(int argc, char** argv)<br />{<br /> QApplication app(argc, argv);
int main(int argc, char** argv)
{
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;);
qmlRegisterType<Person>("People", 1, 0, "Person");
qmlRegisterType<BirthdayParty>("People", 1,0, "BirthdayParty");


MyNamespace::Person myObj;<br /> PartyNamespace::BirthdayParty myParty;
MyNamespace::Person myObj;
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 />}
QDeclarativeView view;
view.setSource(QUrl::fromLocalFile("main.qml"));
view.resize(200,100);
view.show();
return app.exec();
}


</code>
</code>
Line 57: Line 113:
main.qml
main.qml


<code><br />import People 1.0<br />import QtQuick 1.0
<code>
import People 1.0
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;
Text {
text: "Party people: " ''myPerson.name''" " + person1.name + " " + person2.name
BirthdayParty {
id: myParty;
host: Person {
id: myPerson
name: "Sigurd"


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


</code>
</code>

Latest revision as of 12:23, 17 April 2015

This article may require cleanup to meet the Qt Wiki's quality standards. Reason: Auto-imported from ExpressionEngine.
Please improve this article if you can. Remove the {{cleanup}} tag and add this page to Updated pages list after it's clean.

Български English


Как да използваме C++ клас, деклариран в именно пространство(namespace) с Q_PROPERTY и QML

Използването на C++ клас, деклариран в именно пространство в QML в общи линии работи без никакъв проблем. Всичко, което трябва да направите е да се уверите, че сте регистрирали класа за употреба в QML с qmlRegisterType(). Когато обаче, трябва да се обърнете към клас от дадено пространство в Q_PROPERTY , има няколко неща, на които трябва да обърнете внимание, за да работят в QML. Примерът отдолу показва стъпките, който трябва да предприемете.

Прост пример

Долният пример се състои от 2 класа, декларирани в именно пространство:

MyNamespace::Person
PartyNamespace::BirthdayParty

Класът Person се използва в Q_PROPERTY декларация на класа BirthdayParty. За да може QML кода да работи правилно, името на пространството трябва да се включи, когато се обръщаме към класа Person в декларацията на Q_PROPERTY и в съответните прототипи на функциите за четене и писане и също така в прототипите на функциите с флаг Q_INVOKABLE . За да обобщим, C++ няма такива ограничения; достатъчно е декларациите на класа да са в именното пространство и няма нужда да се използват имената на пространствата. Има създадена Jira за подобряване на документацията за този проблем.

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

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

main.cpp

#include <QtGui>
#include <QtDeclarative>

namespace MyNamespace {
 class Person : public QObject
 {
 Q_OBJECT
 Q_PROPERTY(QString name READ name WRITE setName)
 public:
 Person()
 {}

QString name() const
 {
 return m_name;
 }
 void setName(const QString & n)
 {
 m_name = n;
 }

private:
 QString m_name;
 };
}

namespace PartyNamespace {
 class BirthdayParty : public QObject
 {
 Q_OBJECT
 Q_PROPERTY(MyNamespace::Person *host READ host WRITE setHost)
 Q_PROPERTY(QDeclarativeListProperty<MyNamespace::Person> guests READ guests)
 public:
 BirthdayParty()
 {}

MyNamespace::Person *host() const
 {
 return m_host;
 }
 void setHost(MyNamespace::Person *c)
 {
 m_host = c;
 }

QDeclarativeListProperty<MyNamespace::Person> guests()
 {
 return QDeclarativeListProperty<MyNamespace::Person>(this, m_guests);
 }

private:
 MyNamespace::Person '''m_host;
 QList<MyNamespace::Person'''> m_guests;
 };
}

#include "main.moc"

using namespace MyNamespace;
using namespace PartyNamespace;

int main(int argc, char** argv)
{
 QApplication app(argc, argv);

qmlRegisterType<Person>("People", 1, 0, "Person");
 qmlRegisterType<BirthdayParty>("People", 1,0, "BirthdayParty");

MyNamespace::Person myObj;
 PartyNamespace::BirthdayParty myParty;

QDeclarativeView view;
 view.setSource(QUrl::fromLocalFile("main.qml"));
 view.resize(200,100);
 view.show();
 return app.exec();
}

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

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

main.qml

import People 1.0
import QtQuick 1.0

Text {
 text: "Party people: " ''myPerson.name''" " + person1.name + " " + person2.name
 BirthdayParty {
 id: myParty;
 host: Person {
 id: myPerson
 name: "Sigurd"

}
 guests: [
 Person { id: person1; name: "Jakob" },
 Person { id: person2; name: "Dani" }
 ]
 }
}