4

QML コード内で C++ オブジェクトのプロパティを取得できません。オブジェクトはパラメーターとしてシグナルに渡されます。

QMLでは、オブジェクトのプロパティtextRecord抽出できると予想されます。値は である必要がありますabcQVariant(Record)QML はオブジェクトを、そのプロパティtextをと見なしますundefined

Recordは のような値型なQPointので、Q_GADGET宣言を使用します。

馬力:

#ifndef LISTENP_HPP_
#define LISTENP_HPP_

#include <QObject>

#include "Record.hpp"

class ListenP: public QObject
{
Q_OBJECT

public:
    ListenP();
    virtual ~ListenP();

    void emitGotRecord();

signals:
    void gotRecord(Record r);
};

#endif /* LISTENP_HPP_ */

cpp:

#include "ListenP.hpp"

ListenP::ListenP() :
        QObject()
{
}

ListenP::~ListenP()
{
}

void ListenP::emitGotRecord()
{
    emit gotRecord(Record("abc"));
}

レコードの hpp:

#ifndef RECORD_HPP_
#define RECORD_HPP_

#include <QObject>
#include <QMetaType>

class Record
{
Q_GADGET

Q_PROPERTY(QString text READ text WRITE setText)

public:
    Record(const QString& text = "");
    ~Record();

    QString text() const
    {
        return m_text;
    }

    void setText(const QString& text)
    {
        m_text = text;
    }

private:
    QString m_text;
};

Q_DECLARE_METATYPE(Record)

#endif /* RECORD_HPP_ */

レコードの cpp:

#include "Record.hpp"

Record::Record(const QString& text) :
        m_text(text)
{
}

Record::~Record()
{
}

namespace
{
const int RecordMetaTypeId = qMetaTypeId<Record>();
}

QMLピース:

Connections {
    target: listenPModel
    onGotRecord: {
        console.log(r)
        console.log(r.text)
    }
}

メインピース:

QGuiApplication app(argc, argv);

auto listenP = std::make_shared<ListenP>();
QQuickView view;
view.rootContext()->setContextProperty("listenPModel", &*listenP);
view.setSource(QStringLiteral("src/qml/main.qml"));
view.show();

QtConcurrent::run([=]
{
    QThread::sleep(3);
    listenP->emitGotRecord();
});

return app.exec();

ログには次のように表示されます:

qml: QVariant(Record)
qml: undefined
4

1 に答える 1

7

Qt 5.5のリリース ノートには、新機能について次のように記載されています。

  • Qt コア
    • Q_GADGET 内に Q_PROPERTY と Q_INVOKABLE を含めることができるようになりました。QMetaType システムを使用して、そのようなガジェットの QMetaObject を照会する方法があります。

実際、Qt 5.4 で例をコンパイルして実行すると、Qt 5.5 では正しくRecord認識されましたが、結果として次のようになりました。

qml: Record(abc)
qml: abc

また、Q_DECLARE_METATYPE ドキュメントに記載されているように、マクロに渡される型 -Recordこの場合、(1) パブリック デフォルト コンストラクター、(2) パブリック コピー コンストラクター、および (3) パブリック デストラクタを提供する必要があります。は非常に単純なクラスであるためRecord、デフォルトのコンストラクタで十分であるため、コピー コンストラクタを提供する必要はありません。

于 2015-07-16T05:01:11.157 に答える