How to use a C class declared in a namespace with Q PROPERTY and QML/bg: Difference between revisions
No edit summary |
AutoSpider (talk | contribs) (Remove non-functioning "toc" command) |
||
(5 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
[[Category:HowTo]] | {{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]] | ||
= Как да използваме C++ клас, деклариран в именно пространство(namespace) с Q_PROPERTY и QML = | = Как да използваме C++ клас, деклариран в именно пространство(namespace) с Q_PROPERTY и QML = | ||
Използването на C++ клас, деклариран в именно пространство в QML в общи линии работи без никакъв проблем. Всичко, което трябва да направите е да се уверите, че сте регистрирали класа за употреба в 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 | <code>MyNamespace::Person | ||
PartyNamespace::BirthdayParty </code> | |||
Класът ''Person'' се използва в Q_PROPERTY декларация на класа ''BirthdayParty''. За да може QML кода да работи правилно, името на пространството трябва да се включи, когато се обръщаме към класа ''Person'' в декларацията на Q_PROPERTY и в съответните прототипи на функциите за четене и писане и също така в прототипите на функциите с флаг | Класът ''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 | main.cpp | ||
<code> | |||
#include <QtGui> | |||
#include <QtDeclarative> | |||
namespace MyNamespace { | namespace MyNamespace { | ||
class Person : public QObject | |||
{ | |||
Q_OBJECT | |||
Q_PROPERTY(QString name READ name WRITE setName) | |||
public: | |||
Person() | |||
{} | |||
QString name() const | QString name() const | ||
{ | |||
return m_name; | |||
} | |||
void setName(const QString & n) | |||
{ | |||
m_name = n; | |||
} | |||
private: | private: | ||
QString m_name; | |||
}; | |||
} | |||
namespace PartyNamespace { | 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 | MyNamespace::Person *host() const | ||
{ | |||
return m_host; | |||
} | |||
void setHost(MyNamespace::Person *c) | |||
{ | |||
m_host = c; | |||
} | |||
QDeclarativeListProperty | QDeclarativeListProperty<MyNamespace::Person> guests() | ||
{ | |||
return QDeclarativeListProperty<MyNamespace::Person>(this, m_guests); | |||
} | |||
private: | private: | ||
MyNamespace::Person '''m_host; | |||
QList<MyNamespace::Person'''> m_guests; | |||
}; | |||
} | |||
#include | #include "main.moc" | ||
using namespace MyNamespace; | using namespace MyNamespace; | ||
using namespace PartyNamespace; | |||
int main(int argc, char** argv) | int main(int argc, char** argv) | ||
{ | |||
QApplication app(argc, argv); | |||
qmlRegisterType | qmlRegisterType<Person>("People", 1, 0, "Person"); | ||
qmlRegisterType<BirthdayParty>("People", 1,0, "BirthdayParty"); | |||
MyNamespace::Person myObj; | MyNamespace::Person myObj; | ||
PartyNamespace::BirthdayParty myParty; | |||
QDeclarativeView view; | 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> | <code> | ||
import People 1.0 | |||
import QtQuick 1.0 | |||
Text { | 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" } | |||
] | |||
} | |||
} | |||
</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" }
]
}
}