4

編集:問題は解決しました。以下の私の編集を参照してください

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;
}
4

1 に答える 1