使用Q_INVOKABLE将C++与QML连接

use*_*456 12 c++ qt qml qt-slot

我有一个Qt功能:

void MainWindow::button_clicked(Qstring a, Qstring b, Qstring c, Qstring d)
Run Code Online (Sandbox Code Playgroud)

我从QML收集数据,我想将数据传递给Qt中的这个函数.所以我知道我需要使用Q_INVOKABLE但不知道如何使用它.

还有一件事是,当调用上面的某个函数时,可以调用其他函数.
例如:我调用上面的函数,但在她的身体中我调用refresh()函数.这可能吗?

Fra*_*eld 17

为了能够从QML调用方法,您必须使用Q_INVOKABLE或作为插槽标记它.我更喜欢Q_INVOKABLE,如果它不是用作插槽,因为它更小.

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
}
Run Code Online (Sandbox Code Playgroud)

buttonClicked()的实现可以包含任何C++代码.

要使主窗口实例可以从QML访问,您必须注册它,例如

QDeclarativeView* view = ...your view
view->rootContext()->setContextProperty( "_mainWindow", mainWindow );
Run Code Online (Sandbox Code Playgroud)

注册后,您可以从QML调用buttonClicked:

_mainWindow.buttonClicked("foo", "bar", "c", "d")
Run Code Online (Sandbox Code Playgroud)