Как использовать QVariant::fromValue с QString?

У меня есть следующий код:

QString* data = new QString("data to QML");
engine.rootContext()->setContextProperty(QStringLiteral("consoleText"), QVariant::fromValue(data));

а этот не работает, сообщение об ошибке в QTCreator следующее:

...\qglobal.h:693: ошибка: статическое утверждение не удалось: тип не зарегистрирован, используйте макрос Q_DECLARE_METATYPE, чтобы сделать его известным системе метаобъектов Qt #define Q_STATIC_ASSERT_X(условие, сообщение) static_assert(bool(условие) , Сообщение)

Я не думаю, что мне следует использовать Q_DECLARE_METATYPE вместо QString, потому что если я сделаю что-то вроде этого:

engine.rootContext()->setContextProperty(QStringLiteral("consoleText"), QVariant::fromValue(QString("data to QML")));

это работает нормально.

Меня интересует, как я могу использовать QVariant::fromValue() с предварительно объявленным QString.


person Bence Kaulics    schedule 14.12.2015    source источник
comment
Не выделяйте QString в куче, это совершенно бессмысленно.   -  person dtech    schedule 15.12.2015
comment
Я просто тестировал, как связать QML со стороной c++, не обращал внимания на другие вещи.   -  person Bence Kaulics    schedule 15.12.2015


Ответы (2)


QVariant::fromValue() ожидает QString, а не указатель на QString.

Кроме того, размещение объекта QString в куче не имеет особого смысла. Под капотом QString для оптимизации используется копирование при записи (COW); фактические данные, хранящиеся в QString, в любом случае всегда будут в куче.

person MrEricSir    schedule 14.12.2015
comment
Я просто проверяю, что это недействительный код, QString будет заполнен QSerialPort. - person Bence Kaulics; 15.12.2015
comment
Аааа, эта маска на твоей кошке потрясающая. :D (Хорошо, отметьте это как слишком болтливое) - person BaCaRoZzo; 15.12.2015

data — это указатель на QString, а не на сам QString. Чтобы использовать метод QVariant::fromValue(), вы должны разыменовать указатель:

engine.rootContext()->setContextProperty(QStringLiteral("consoleText"), QVariant::fromValue(*data));
                                                                                            ^

Это связано с тем, что QString * не является зарегистрированным метатипом (по умолчанию).

person owacoder    schedule 14.12.2015