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

From Qt Wiki
Jump to: navigation, search
Български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

  1. include <QtGui>
  2. 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;
};

}

  1. 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" }
]
}

}