How to Bind a QML property to a C++ Function/pt: Difference between revisions
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
[[Category:HowTo]] | [[Category:HowTo]] | ||
[[Category:Portuguese::HowTo]] | |||
[[Category:Developing_with_Qt::General]] | [[Category:Developing_with_Qt::General]] | ||
[[Category:Portuguese::Developing_with_Qt::General]] | |||
[[Category:Tutorial]] | [[Category:Tutorial]] | ||
[[Category:Portuguese::Tutorial]] | |||
[toc align_right="yes" depth="2"] | [toc align_right="yes" depth="2"] | ||
Line 10: | Line 13: | ||
No momento o QtQuick não suporta um modo de ligar uma propriedade QML ao resultado de uma função em C+''. No entanto, existe uma sugestão para adicionar suporte a este recurso "aqui":https://bugreports.qt.nokia.com//browse/QTBUG-17323 . | No momento o QtQuick não suporta um modo de ligar uma propriedade QML ao resultado de uma função em C+''. No entanto, existe uma sugestão para adicionar suporte a este recurso "aqui":https://bugreports.qt.nokia.com//browse/QTBUG-17323 . | ||
Neste artigo, vamos mostrar como viabilizar a associação de propriedades QML e funções usando "Q_PROPERTY":http://doc.qt.nokia.com/latest/qobject.html#Q_PROPERTY juntamente com o sinal "NOTIFY":http://doc.qt.nokia.com/latest/properties.html#qt-s-property-system , que é emitido sempre que o valor da propriedade muda. | |||
h2. O Código em C''+ | |||
Na classe Object no exemplo abaixo, nós criamos uma Q_PROPERTY que é usada para modificar e atualizar o texto do código QML e que tem um sinal changeOfStatus() que é emitido sempre que o status da função em C++ chamada function someFunction() mudar: | Na classe Object no exemplo abaixo, nós criamos uma Q_PROPERTY que é usada para modificar e atualizar o texto do código QML e que tem um sinal changeOfStatus() que é emitido sempre que o status da função em C++ chamada function someFunction() mudar: | ||
Line 21: | Line 26: | ||
Object::someFunction() é chamado a partir do QML pois ele usa "Q_INVOKABLE":http://doc.qt.nokia.com/latest/qobject.html#Q_INVOKABLE. Ela simplesmente muda o status de uma variável membro, e é chamado a cada 5 segundos usando um "QTimer":http://doc.qt.nokia.com/latest/qtimer.html para ilustrar como a propriedade QML é capaz de reagir à mudança dessa. Ela pode também ser chamada a partir do código QML ao clicar no texto. Por fim, ela emite o sinal changeOfStatus() que aciona Object::getTheChange(), que deve ser chamado quando o texto deve ser reavaliado. | Object::someFunction() é chamado a partir do QML pois ele usa "Q_INVOKABLE":http://doc.qt.nokia.com/latest/qobject.html#Q_INVOKABLE. Ela simplesmente muda o status de uma variável membro, e é chamado a cada 5 segundos usando um "QTimer":http://doc.qt.nokia.com/latest/qtimer.html para ilustrar como a propriedade QML é capaz de reagir à mudança dessa. Ela pode também ser chamada a partir do código QML ao clicar no texto. Por fim, ela emite o sinal changeOfStatus() que aciona Object::getTheChange(), que deve ser chamado quando o texto deve ser reavaliado. | ||
main.cpp | main.cpp | ||
</code> | |||
#include <QtGui> | |||
#include <QtDeclarative> | |||
class Object : public QObject | class Object : public QObject | ||
{ | |||
Q_OBJECT | |||
Q_PROPERTY(QString theChange READ getTheChange NOTIFY changeOfStatus) | |||
public: | public: | ||
Object() | |||
{ | |||
changeMe = false; | |||
myTimer = new QTimer(this); | |||
myTimer->start(5000); | |||
connect(myTimer, SIGNAL (timeout()), this, SLOT (testSlot())); | |||
} | |||
QString getTheChange() | QString getTheChange() | ||
{ | |||
if (theValue 0) | |||
{ | { | ||
return "The text changed"; | return "The text changed"; | ||
} | } | ||
if (theValue 1) | if (theValue 1) | ||
{ | |||
return "New text change"; | |||
} | |||
return "nothing has happened yet"; | |||
} | } | ||
Q_INVOKABLE void someFunction(int i) | Q_INVOKABLE void someFunction(int i) | ||
{ | |||
if ( i 0) { | |||
theValue = 0; | theValue = 0; | ||
} | } | ||
if (i 1) { | if (i 1) { | ||
theValue = 1; | |||
} | |||
emit changeOfStatus(i); | |||
} | |||
signals: | |||
void changeOfStatus(int i) ; | |||
public slots: | |||
void testSlot() | |||
{ | |||
if (changeMe) | |||
{ | |||
someFunction(0); | |||
} else { | |||
someFunction(1); | |||
} | |||
changeMe = !changeMe; | |||
} | |||
private: | |||
bool changeMe; | |||
int theValue; | |||
QTimer '''myTimer; | |||
}; | |||
#include "main.moc" | |||
int main(int argc, char'''* argv) | |||
{ | |||
QApplication app(argc, argv); | |||
Object myObj; | |||
QDeclarativeView view; | |||
view.rootContext()->setContextProperty("rootItem", (QObject *)&myObj); | |||
view.setSource(QUrl::fromLocalFile("main.qml")); | |||
view.show(); | |||
return app.exec(); | |||
} | } | ||
<code> | |||
== O Código QML == | == O Código QML == | ||
Line 57: | Line 113: | ||
main.qml | main.qml | ||
</code> | </code> | ||
import QtQuick 1.0 | |||
Rectangle { | Rectangle { | ||
width: 440; height: 150 | |||
Column { | Column { | ||
anchors.fill: parent; spacing: 20 | |||
Text { | Text { | ||
text: rootItem.theChange | |||
font.pointSize: 25; anchors.horizontalCenter: parent.horizontalCenter | |||
} | } | ||
} | |||
} | |||
<code> |
Revision as of 11:40, 25 February 2015
[toc align_right="yes" depth="2"]
Associando uma propriedade QML a uma função em C++
No momento o QtQuick não suporta um modo de ligar uma propriedade QML ao resultado de uma função em C+. No entanto, existe uma sugestão para adicionar suporte a este recurso "aqui":https://bugreports.qt.nokia.com//browse/QTBUG-17323 .
Neste artigo, vamos mostrar como viabilizar a associação de propriedades QML e funções usando "Q_PROPERTY":http://doc.qt.nokia.com/latest/qobject.html#Q_PROPERTY juntamente com o sinal "NOTIFY":http://doc.qt.nokia.com/latest/properties.html#qt-s-property-system , que é emitido sempre que o valor da propriedade muda.
h2. O Código em C+
Na classe Object no exemplo abaixo, nós criamos uma Q_PROPERTY que é usada para modificar e atualizar o texto do código QML e que tem um sinal changeOfStatus() que é emitido sempre que o status da função em C++ chamada function someFunction() mudar:
Q_PROPERTY(QString theChange READ getTheChange NOTIFY changeOfStatus)<code>
A função Object::getTheChange() modifica o texto de um item QML dependendo do resultado de Object::someFunction(). O resultado é usado como valor do texto da propriedade no código QML.
Object::someFunction() é chamado a partir do QML pois ele usa "Q_INVOKABLE":http://doc.qt.nokia.com/latest/qobject.html#Q_INVOKABLE. Ela simplesmente muda o status de uma variável membro, e é chamado a cada 5 segundos usando um "QTimer":http://doc.qt.nokia.com/latest/qtimer.html para ilustrar como a propriedade QML é capaz de reagir à mudança dessa. Ela pode também ser chamada a partir do código QML ao clicar no texto. Por fim, ela emite o sinal changeOfStatus() que aciona Object::getTheChange(), que deve ser chamado quando o texto deve ser reavaliado.
main.cpp
- include <QtGui>
- include <QtDeclarative>
class Object : public QObject {
Q_OBJECT Q_PROPERTY(QString theChange READ getTheChange NOTIFY changeOfStatus)
public:
Object() { changeMe = false; myTimer = new QTimer(this); myTimer->start(5000); connect(myTimer, SIGNAL (timeout()), this, SLOT (testSlot())); }
QString getTheChange()
{ if (theValue 0) { return "The text changed"; } if (theValue 1) { return "New text change"; } return "nothing has happened yet";
}
Q_INVOKABLE void someFunction(int i)
{ if ( i 0) { theValue = 0; } if (i 1) { theValue = 1; }
emit changeOfStatus(i);
}
signals:
void changeOfStatus(int i) ; public slots: void testSlot() { if (changeMe) { someFunction(0); } else { someFunction(1); } changeMe = !changeMe; }
private:
bool changeMe; int theValue; QTimer myTimer;
};
- include "main.moc"
int main(int argc, char* argv) {
QApplication app(argc, argv); Object myObj; QDeclarativeView view; view.rootContext()->setContextProperty("rootItem", (QObject *)&myObj); view.setSource(QUrl::fromLocalFile("main.qml")); view.show(); return app.exec();
}
== O Código QML ==
No código QML abaixo, nós criamos um "Rectangle":http://doc.qt.nokia.com/latest/qml-rectangle.html que reage aos cliques do mouse. O texto é modificado através do resultado da função Object::theChange().
main.qml
import QtQuick 1.0
Rectangle {
width: 440; height: 150
Column {
anchors.fill: parent; spacing: 20
Text {
text: rootItem.theChange font.pointSize: 25; anchors.horizontalCenter: parent.horizontalCenter
}
}
}