2012-02-18 12 views
12

Mam funkcji Qt:Podłączanie C++ z użyciem QML Q_INVOKABLE

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

mogę zbierać dane z QML i chcę przekazać dane do tej funkcji, która jest w Qt. Więc wiem, że muszę użyć Q_INVOKABLE, ale nie wiem, jak go używać.

I jeszcze jedno możliwe jest wywołanie innej funkcji przy przywołaniu tego powyżej.
Na przykład: przywołuję powyższą funkcję, ale w jej ciele wywołuję funkcję refresh(). czy to możliwe?

Odpowiedz

16

Aby móc wywołać metodę z QML, musisz oznaczyć ją Q_INVOKABLE lub jako slot. Wolę Q_INVOKABLE, jeśli nie ma być używany jako slot, ponieważ jest bardziej minimalny.

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 
} 

Implementacja buttonClicked() może zawierać dowolny kod C++.

Aby udostępnić główną instancję okna z QML, musisz ją zarejestrować, np.

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

Po zarejestrowaniu można nazwać buttonClicked z QML:

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

hi mam to w mainwindow.cpp: 'QDeclarativeView * view = new QDeclarativeView; ui> setupUi (this); setCentralWidget (widok); QDeclarativeContext * ctxt = view-> rootContext(); ctxt-> setContextProperty ("mójModel", QVariant :: fromValue (MainWindow :: dataList)); widok-> setSource (QUrl ("qrc: /gui.qml")); widok-> setResizeMode (QDeclarativeView :: SizeRootObjectToView); "jak ustawić linię w środku? W main.cpp tworzę tylko mainwindow i metodę show call. –

+0

Prawdopodobnie będzie to ctxt-> setContextProperty ("_mainWindow", this); następnie. –

+0

który działał. dziękuję –