2012-02-18 13 views
12

Tôi có một chức năng Qt:Connecting C++ với QML sử dụng Q_INVOKABLE

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

tôi thu thập dữ liệu từ QML và tôi muốn truyền dữ liệu cho chức năng này mà là ở Qt. Vì vậy, tôi biết tôi cần phải sử dụng Q_INVOKABLE nhưng không biết thực sự làm thế nào để sử dụng nó.

Và một điều nữa là có thể gọi một số chức năng khác khi gọi điều này ở trên.
Ví dụ: Tôi gọi hàm trên nhưng trong cơ thể của mình, tôi gọi hàm refresh(). Điều này có thể không?

Trả lời

16

Để có thể gọi phương thức từ QML, bạn phải đánh dấu phương thức đó bằng Q_INVOKABLE hoặc dưới dạng vị trí. Tôi thích Q_INVOKABLE nếu nó không có nghĩa là để được sử dụng như một khe, như nó tối thiểu hơn.

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 
} 

Việc triển khai buttonClicked() có thể chứa bất kỳ mã C++ nào.

Để tạo phiên bản cửa sổ chính có thể truy cập từ QML, bạn phải đăng ký nó, ví dụ:

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

Sau khi đăng ký, bạn có thể gọi buttonClicked từ QML:

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

hi tôi có điều này trong mainwindow.cpp: 'QDeclarativeView * view = new QDeclarativeView; ui-> setupUi (điều này); setCentralWidget (xem); QDeclarativeContext * ctxt = view-> rootContext(); ctxt-> setContextProperty ("myModel", QVariant :: fromValue (MainWindow :: dataList)); chế độ xem-> setSource (QUrl ("qrc: /gui.qml")); view-> setResizeMode (QDeclarativeView :: SizeRootObjectToView); 'vậy làm thế nào để đặt dòng của bạn bên trong? Trong main.cpp tôi chỉ tạo mainwindow và gọi phương thức show. –

+0

Nó có thể sẽ là ctxt-> setContextProperty ("_mainWindow", điều này); sau đó. –

+0

đã hoạt động. cảm ơn bạn –