Соединение C ++ с QML с помощью Q_INVOKABLE

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

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

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

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


person user123_456    schedule 18.02.2012    source источник


Ответы (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 () может содержать любой код C ++.

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

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

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

_mainWindow.buttonClicked("foo", "bar", "c", "d")
person Frank Osterfeld    schedule 18.02.2012
comment
привет, у меня есть это в mainwindow.cpp: QDeclarativeView *view= new QDeclarativeView; ui->setupUi(this); setCentralWidget(view); QDeclarativeContext *ctxt = view->rootContext(); ctxt->setContextProperty("myModel", QVariant::fromValue(MainWindow::dataList)); view->setSource(QUrl("qrc:/gui.qml")); view->setResizeMode(QDeclarativeView::SizeRootObjectToView); так как же поместить вашу строку внутрь? В main.cpp я создаю только mainwindow и вызываю метод show. - person user123_456; 18.02.2012
comment
Вероятно, это будет ctxt- ›setContextProperty (_mainWindow, this); тогда. - person Frank Osterfeld; 18.02.2012
comment
Акива: Под регистрацией я имел в виду установить его как свойство контекста в корневом контексте, как это сделано в приведенном выше фрагменте. - person Frank Osterfeld; 25.09.2014