В моем проекте есть перечисление, для которого сделан отдельный класс:
DataQuality.h
#include <QObject>
class DataQuality
{
Q_GADGET // Вместо QObject добавляется только рефлексия, которая исползуется в QML
public:
enum class Value { // Нельзя использовать struct, так как с ним в QML все значения всегда будут undefined
None=0,
Normal=1,
Imperfect=2
};
Q_ENUM(Value)
};
Этот класс регистрируется в QML-среде вот так:
qmlRegisterUncreatableType<DataQuality>("company.DataQuality", 1, 0, "DataQuality", "You cannot create an instance of the DataQuality.");
После чего в QML-коде можно прописать импорт:
import company.DataQuality 1.0
И значения типа DataQuality становятся доступными в QML:
console.log("DataQuality normal is: "+DataQuality.Value.Normal);
DataQuality normal is: 1
То есть, до этого момента все в порядке. Код в C++ и QML части практически становится единообразным, т. к. доступ к значениям enum выглядит так:
C++: DataQuality::Value::Normal
QML: DataQuality.Value.Normal
* * *
Проблема возникает в случае, если попробовать этот тип передавать в сигнале. Плюсовая часть:
signals:
void setTransportAngle(float angle, DataQuality::Value quality);
...
emit setTransportAngle( 0.5, DataQuality::Value::Normal );
QML-часть:
Connections {
target: viewDataEmitter
onSetTransportAngle: {
courseIndicatorComponent.angle=angle;
courseIndicatorComponent.quality=quality;
}
}
Компилится все без ошибок, но в момент исполнения QML-кода появляется ошибка:
IndicatorArea.qml:124: Error: Cannot assign [undefined] to double
То есть, не обрабатывается даже первый параметр сигнала. Но если вперед передвинуть quality, то ошибка будет аналогичной:
IndicatorArea.qml:124: Error: Cannot assign [undefined] to int
То есть, проблема тут не в конвертации в double или в int, а в том, что оба значения параметров сигнала undefined.
В связи с вышеозначенным вопрос: как в Qt/QML можно передавать через сигналы значения с нестандартным типом данных?
Кастую сюда EXL, Dendy, RazrFalcon, deep-purple.