2012-02-18 15 views
12

Tengo una función Qt:Conexión de C++ con QML usando Q_INVOKABLE

void MainWindow::button_clicked(Qstring a, Qstring b, Qstring c, Qstring d) 

I recoger datos de QML y quiero pasar datos a esta función que está en Qt. Entonces sé que necesito usar Q_INVOKABLE pero no sé realmente cómo usarlo.

Y una cosa más es que es posible invocar alguna otra función cuando se invoque esta cierta arriba.
Por ejemplo: Invoco la función anterior pero en su cuerpo invoco la función refresh(). es posible?

Respuesta

16

Para poder llamar a un método desde QML, debe marcarlo con Q_INVOKABLE o como un espacio. Prefiero Q_INVOKABLE si no está destinado a ser utilizado como un espacio, ya que es más mínimo.

class MainWindow : public QMainWindow { 
    Q_OBJECT 
public: 
... 
    Q_INVOKABLE void buttonClicked(const QString& a, const QString& b, const QString& c, const QString& d); 
.... 
}; 

void MainWindow::buttonClicked(const QString& a, const QString& b, const QString& c, const QString& d) { 
    ...do stuff 
    update(); //example 
} 

La implementación de buttonClicked() puede contener cualquier código C++.

Para que la instancia de la ventana principal sea accesible desde QML, debe registrarla, p.

QDeclarativeView* view = ...your view 
view->rootContext()->setContextProperty("_mainWindow", mainWindow); 

Una vez registrado, puede llamar buttonClicked de QML:

_mainWindow.buttonClicked("foo", "bar", "c", "d") 
+0

hola tengo esto en mainwindow.cpp: 'QDeclarativeView * view = nueva QDeclarativeView; ui-> setupUi (esto); setCentralWidget (ver); QDeclarativeContext * ctxt = view-> rootContext(); ctxt-> setContextProperty ("myModel", QVariant :: fromValue (MainWindow :: dataList)); view-> setSource (QUrl ("qrc: /gui.qml")); view-> setResizeMode (QDeclarativeView :: SizeRootObjectToView); 'entonces, ¿cómo poner tu línea dentro? En main.cpp solo creo mainwindow y call show method. –

+0

Probablemente sería ctxt-> setContextProperty ("_mainWindow", esto); entonces. –

+0

que funcionó. gracias –