qt — передача Q_GADGET в качестве параметра сигнала из C ++ в QML

Не удается получить свойство объекта C ++ внутри кода QML.
Объект передается в качестве параметра для сигнала.

Ожидается, что в QML свойство text из Record объект может быть извлечен. И значение должно быть abc, QML видит объект как QVariant(Record)и его собственность text как undefined,

Record это тип значения типа QPointтак что он использует Q_GADGET декларация.

HPP:

#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_ */

каст:

#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

3

Решение

заметки о выпуске для Qt 5.5 говорит о новых возможностях:

  • Qt Core
    • Вы можете теперь есть Q_PROPERTY и Q_INVOKABLE внутри Q_GADGET, и есть способ запросить QMetaObject такого гаджета, используя систему QMetaType

Действительно, компиляция и запуск вашего примера с Qt 5.4 дает тот же результат, что и ваш в то время как с Qt 5.5 я получил Record правильно распознан, т.е. я получил в результате:

qml: Record(abc)
qml: abc

Кроме того, как указано в Q_DECLARE_METATYPE документация, тип, переданный макросу — Record в этом случае следует предоставить (1) открытый конструктор по умолчанию, (2) открытый конструктор копирования и (3) открытый деструктор. поскольку Record это очень простой класс, нет необходимости предоставлять конструктор копирования, так как по умолчанию достаточно.

7

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


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