編集:問題は解決しました。以下の私の編集を参照してください
QQmlContext::setContextObject を使用して C++ オブジェクトを QML から見えるようにするのに問題があります。リンクで QQmlContext のドキュメントを読みました。これは、setContextObject を使用して、QObject 派生クラスの Q_PROPERTY を QML に表示できるようにすることを示唆しています。次のコードは、問題を示しています。
main.cpp
#include <QObject>
#include <QQmlEngine>
#include <QGuiApplication>
class MyClass : public QObject
{
Q_OBJECT
Q_PROPERTY(QString myProperty READ prop NOTIFY propChanged)
public:
MyClass(QObject * parent = 0) : QObject(parent) {}
QString prop() { return QString("Hello from MyClass"); }
Q_SIGNALS:
void propChanged(void);
};
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlEngine engine;
QQmlContext *objectContext = new QQmlContext(engine.rootContext());
MyClass myClass;
objectContext->setContextObject(&myClass);
QQmlComponent component(&engine, "main.qml");
QObject *object = component.create(objectContext);
return app.exec();
}
main.qml
import QtQuick 2.1
import QtQuick.Controls 1.0
ApplicationWindow
{
Text
{
text: myProperty
}
}
このプログラムを実行すると、エラーが発生します
file:///C:/Path/to/main.qml:8: ReferenceError: myProperty is not defined
よろしくお願いします。
環境。MSVC2010コンパイラを使用して、Windows 7でQt 5.1.1を使用しています
編集。私自身の質問に答えます。クリーンなリビルドにより、ビルド出力フォルダーに古いオブジェクトが含まれていることが明らかになりました。
1 つの注意点: MyClass は別のファイルに配置する必要があります。そうしないと、moc コンパイラはその魔法を実行できません。
整理された main.cpp は次のようになります
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlEngine engine;
QQmlContext * context = new QQmlContext(engine.rootContext());
QObject::connect(&engine, SIGNAL(quit()), QCoreApplication::instance(), SLOT(quit ()));
MyClass myClass;
context->setContextObject(&myClass);
QQmlComponent component(&engine, "main.qml");
QQuickWindow * topLevel = qobject_cast<QQuickWindow*>(component.create(context));
topLevel->show();
int rc = app.exec();
delete topLevel;
delete context;
return rc;
}