Вызов метода C ++ из QML (приложение Qt Quick)

Итак, я провел некоторый поиск, и ни один из похожих вопросов, которые я прочитал, не дал совета, который сработал.

Я использую Qt Creator (и я не слишком знаком с Qt), поэтому я не уверен, что это вуду, это делается в фоновом режиме. Однако я использую стандартный проект Qt Quick Application.

По сути, я хочу вызвать функцию C ++ из QML, которая периодически возвращает строку, которая заменяет некоторый текст в макете.

Вот main.cpp:

#include <QtGui/QApplication>
#include "qmlapplicationviewer.h"#include <QDeclarativeContext>class testClass : public QObject
{
Q_OBJECT
public:
Q_INVOKABLE QString gimmeText() {
return QString("new text");
}
};Q_DECL_EXPORT int main(int argc, char *argv[])
{
QScopedPointer<QApplication> app(createApplication(argc, argv));

QmlApplicationViewer viewer;

viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto);
viewer.setMainQmlFile(QLatin1String("qml/Picenter2/main.qml"));

testClass t;
viewer.rootContext()->setContextProperty("testOb", &t);

viewer.showFullScreen();

return app->exec();
}

А вот фрагмент макета (так как большинство из него явно не имеет значения):

Text {
id: text1
x: 105
y: 156
color: "#ffffff"text: qsTr("text")
font.pixelSize: 12
Timer {
interval: 1000; running: true; repeat: false
onTriggered: text1.text = testOb.gimmeText();
}

Приведенные ошибки:

invalid use of incomplete type 'struct QDeclarativeContext' main.cpp (28)
forward declaration of 'struct QDeclarativeContext' qdeclarativeview.h (60)

РЕДАКТИРОВАТЬ: с включенным QDeclarativeContext вышеупомянутые исчезают, выдавая эти ошибки:

(.text.startup+0x3e):-1: error: undefined reference to `vtable for testClass'
(.text.startup+0xcf):-1: error: undefined reference to `vtable for testClass'
(.text.startup+0x12b):-1: error: undefined reference to `vtable for testClass'
:-1: error: collect2: ld returned 1 exit status

Я не много занимался программированием на C ++, поэтому не совсем понимаю, что это значит. Следование совету по существу идентичных проблем дало мне только возможные ошибки или более непонятные вещи.

Что меня действительно смущает, так это то, что, глядя на файл заголовка, QmlApplicationViewer является производным от QDeclarativeView, и это именно то, что использует документация Qt. Вот делать почти то, что я хочу. Спасибо за любые предложения, у кого есть.

8

Решение

Вы должны зарегистрировать свой класс для использования его с QML. Вы можете сделать это в основной функции. Вы также должны импортировать его в код QML. Ваш код должен выглядеть так:

main.cpp:

#include <QtGui/QApplication>
#include "qmlapplicationviewer.h"#include <QDeclarativeContext>

#include <QtDeclarative>    // Required for registrationclass testClass : public QObject
{
Q_OBJECT
public:
Q_INVOKABLE QString gimmeText() {
return QString("new text");
}
};Q_DECL_EXPORT int main(int argc, char *argv[])
{
QScopedPointer<QApplication> app(createApplication(argc, argv));

qmlRegisterType<testClass>("MyCustomQMLObjects", 2, 35, "testClassNameInQML");

QmlApplicationViewer viewer;

viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto);
viewer.setMainQmlFile(QLatin1String("qml/Picenter2/main.qml"));

testClass t;
viewer.rootContext()->setContextProperty("testOb", &t);

viewer.showFullScreen();

return app->exec();
}

Код QML:

// ...

import MyCustomQMLObjects 2.35

// ...

property testClassNameInQML testOb

// ...

Text {
id: text1
x: 105
y: 156
color: "#ffffff"text: qsTr("text")
font.pixelSize: 12
Timer {
interval: 1000; running: true; repeat: false
onTriggered: text1.text = testOb.gimmeText();
}

// ...
5

Другие решения

У меня нет опыта работы с qt и я не вижу, что в коде вызывает ошибку. Однако, когда такие ошибки происходят, это происходит потому, что класс (struct QDeclarativeContext) был форвард объявил, но это используется, как будто все определение известно (получить доступ к члену, объявить переменную этого типа и т. д.). Чтобы это исправить, нужно включить заголовок который имеет определение этого типа.

0

По вопросам рекламы [email protected]