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

From Qt Wiki
< How to use a C class declared in a namespace with Q PROPERTY and QML
Revision as of 12:23, 17 April 2015 by AutoSpider (talk | contribs) (Remove non-functioning "toc" command)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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" }
 ]
 }
}