How to Bind a QML property to a C++ Function/pt: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
No edit summary
(Abuse of categories for localization; removed from categories)
 
(8 intermediate revisions by 2 users not shown)
Line 1: Line 1:
[[Category:HowTo]]<br />[[Category:Portuguese::HowTo]]
{{Cleanup | reason=Auto-imported from ExpressionEngine.}}


[[Category:Developing_with_Qt::General]]<br />[[Category:Portuguese::Developing_with_Qt::General]]
[[Category:HowTo]]
[[Category:Developing_with_Qt]]
[[Category:Tutorial]]


[[Category:Tutorial]]<br />[[Category:Portuguese::Tutorial]]
= Associando uma propriedade QML a uma função em C++ =


[toc align_right=&quot;yes&amp;quot; depth=&quot;2&amp;quot;]
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 [https://bugreports.qt.nokia.com//browse/QTBUG-17323 aqui] .


= Associando uma propriedade QML a uma função em C++ =
Neste artigo, vamos mostrar como viabilizar a associação de propriedades QML e funções usando [http://doc.qt.nokia.com/latest/qobject.html#Q_PROPERTY Q_PROPERTY] juntamente com o sinal [http://doc.qt.nokia.com/latest/properties.html#qt-s-property-system NOTIFY] , que é emitido sempre que o valor da propriedade muda.
 
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 &quot;aqui&amp;quot;:https://bugreports.qt.nokia.com//browse/QTBUG-17323 .
<br />Neste artigo, vamos mostrar como viabilizar a associação de propriedades QML e funções usando &quot;Q_PROPERTY&amp;quot;:http://doc.qt.nokia.com/latest/qobject.html#Q_PROPERTY juntamente com o sinal &quot;NOTIFY&amp;quot;:http://doc.qt.nokia.com/latest/properties.html#qt-s-property-system , que é emitido sempre que o valor da propriedade muda.
<br />h2. O Código em C''+


== 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 19: Line 18:
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.
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 &quot;Q_INVOKABLE&amp;quot;: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 &quot;QTimer&amp;quot;: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 [http://doc.qt.nokia.com/latest/qobject.html#Q_INVOKABLE Q_INVOKABLE]. Ela simplesmente muda o status de uma variável membro, e é chamado a cada 5 segundos usando um [http://doc.qt.nokia.com/latest/qtimer.html QTimer] 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<br /></code><br />#include &lt;QtGui&amp;gt;<br />#include &lt;QtDeclarative&amp;gt;
main.cpp
</code>
#include <QtGui>
#include <QtDeclarative>


class Object : public QObject<br />{<br /> Q_OBJECT<br /> Q_PROPERTY(QString theChange READ getTheChange NOTIFY changeOfStatus)
class Object : public QObject
{
Q_OBJECT
Q_PROPERTY(QString theChange READ getTheChange NOTIFY changeOfStatus)


public:<br /> Object()<br /> {<br /> changeMe = false;<br /> myTimer = new QTimer(this);<br /> myTimer-&gt;start(5000);<br /> connect(myTimer, SIGNAL (timeout()), this, SLOT (testSlot()));<br /> }
public:
Object()
{
changeMe = false;
myTimer = new QTimer(this);
myTimer->start(5000);
connect(myTimer, SIGNAL (timeout()), this, SLOT (testSlot()));
}


QString getTheChange()<br /> {<br /> if (theValue  0)  
QString getTheChange()
   &amp;#123;
{
   return &amp;quot;The text changed&amp;quot;;
if (theValue  0)  
   &amp;#125;
   {
   if (theValue  1)<br /> {<br /> return &quot;New text change&amp;quot;;<br /> }<br /> return &quot;nothing has happened yet&amp;quot;;
   return "The text changed";
   }
   if (theValue  1)
{
return "New text change";
}
return "nothing has happened yet";


}
}


Q_INVOKABLE void someFunction(int i)<br /> {<br /> if ( i  0) &amp;#123;
Q_INVOKABLE void someFunction(int i)
{
if ( i  0) {
   theValue = 0;
   theValue = 0;
   &amp;#125;
   }
   if (i  1) {<br /> theValue = 1;<br /> }
   if (i  1) {
theValue = 1;
}


emit changeOfStatus(i);<br /> }
emit changeOfStatus(i);
}


signals:<br /> void changeOfStatus(int i) ;<br /> public slots:<br /> void testSlot()<br /> {<br /> if (changeMe)<br /> {<br /> someFunction(0);<br /> } else {<br /> someFunction(1);<br /> }<br /> changeMe = !changeMe;<br /> }
signals:
void changeOfStatus(int i) ;
public slots:
void testSlot()
{
if (changeMe)
{
someFunction(0);
} else {
someFunction(1);
}
changeMe = !changeMe;
}


private:<br /> bool changeMe;<br /> int theValue;<br /> QTimer '''myTimer;
private:
<br />};
bool changeMe;
<br />#include &quot;main.moc&amp;quot;
int theValue;
<br />int main(int argc, char'''* argv)<br />{<br /> QApplication app(argc, argv);<br /> Object myObj;<br /> QDeclarativeView view;<br /> view.rootContext()-&gt;setContextProperty(&quot;rootItem&amp;quot;, (QObject *)&amp;myObj);<br /> view.setSource(QUrl::fromLocalFile&amp;amp;#40;&quot;main.qml&amp;quot;&amp;#41;);<br /> view.show();<br /> return app.exec&amp;amp;#40;&amp;#41;;
QTimer '''myTimer;


}<br /><code>
};
 
#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 ==


No código QML abaixo, nós criamos um &quot;Rectangle&amp;quot;: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().
No código QML abaixo, nós criamos um [http://doc.qt.nokia.com/latest/qml-rectangle.html Rectangle] que reage aos cliques do mouse. O texto é modificado através do resultado da função Object::theChange().


main.qml
main.qml


</code><br />import QtQuick 1.0
</code>
import QtQuick 1.0


Rectangle {<br /> width: 440; height: 150
Rectangle {
width: 440; height: 150


Column {<br /> anchors.fill: parent; spacing: 20
Column {
anchors.fill: parent; spacing: 20


Text {<br /> text: rootItem.theChange<br /> font.pointSize: 25; anchors.horizontalCenter: parent.horizontalCenter
Text {
text: rootItem.theChange
font.pointSize: 25; anchors.horizontalCenter: parent.horizontalCenter


}<br /> }<br />}<br /><code>
}
}
}
<code>

Latest revision as of 00:48, 25 May 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.

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 .

Neste artigo, vamos mostrar como viabilizar a associação de propriedades QML e funções usando Q_PROPERTY juntamente com o sinal NOTIFY , que é emitido sempre que o valor da propriedade muda.

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 [http://doc.qt.nokia.com/latest/qobject.html#Q_INVOKABLE Q_INVOKABLE]. Ela simplesmente muda o status de uma variável membro, e é chamado a cada 5 segundos usando um [http://doc.qt.nokia.com/latest/qtimer.html QTimer] 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
  1. include <QtGui>
  2. 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;

};

  1. 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 [http://doc.qt.nokia.com/latest/qml-rectangle.html Rectangle] 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

}

}

}