How to use a C class declared in a namespace with Q PROPERTY and QML/bg
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
[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
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
#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" }
]
}
}