Подтвердить что ты не робот

Подключение С++ с QML с помощью Q_INVOKABLE

У меня есть функция Qt:

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

Я собираю данные из QML, и я хочу передать данные этой функции, находящейся в Qt. Поэтому я знаю, что мне нужно использовать Q_INVOKABLE, но не знаю, как его использовать.

И еще одно: можно вызвать какую-то другую функцию при вызове этого определенного выше. Например: я вызываю указанную выше функцию, но в ее теле я вызываю функцию refresh(). Возможно ли это?

4b9b3361

Ответ 1

Чтобы иметь возможность вызывать метод из 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
}

Реализация buttonClicked() может содержать любой код на С++.

Чтобы сделать экземпляр основного окна доступным из QML, вы должны зарегистрировать его, например.

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

После регистрации вы можете вызвать buttonClicked из QML:

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