Я разрабатываю приложение в Qt, которое использует модуль QScript. Класс, над которым я работаю, является производным от QObject, поэтому он будет «сценарием». Один из методов должен возвращать список двойных значений (QList). Когда я создаю глобальный объект сценария с одним экземпляром класса, используя engine.newQObject (class_instance)), я могу получить прекрасный доступ к ряду методов объекта сценария, показывая, что процесс работает. Я могу вызвать из скрипта метод, который возвращает значение типа double, но функция, которая должна вернуть QList, хранит молчание.
Любая идея, как я мог бы реализовать метод класса C ++, чтобы он верно вернул этот список двойных значений?
Код:
class AbstractPlotWidget : public QCustomPlot
{
Q_OBJECT;
(объявлено как Q_INVOKABLE)
QList<double>
AbstractPlotWidget::keys()
{
QList<double> keyList;
QCPDataMap *data = graph()->data();
return data->keys();
}
Когда я запускаю эту функцию, все, что я получаю в консоли сценария, это:
QVariant (QList)
Я создал следующую тестовую функцию, которая возвращает QStringList, представляющий список двойных значений:
(объявлено как Q_INVOKABLE)
QStringList
AbstractPlotWidget::keysAsStringList()
{
QStringList keyStringList;
QCPDataMap *data = graph()->data();
QList<double> keyList = data->keys();
for(int iter = 0; iter < keyList.size(); ++iter)
{
double keyValue = keyList.at(iter);
keyStringList.append(QString("%1\n").arg(keyValue));
}
return keyStringList;
}
И когда я запускаю эту функцию, консоль сценария эффективно показывает текст с разделенными запятыми двойными значениями.
Я также написал простую функцию, возвращающую единственное двойное значение, и это тоже работает. Другая тестовая функция возвращает QList<int>
работает.
Так что я думаю, что нет автоконверсии между QList<double>
и соответствующее значение сценария. Похоже, мне нужен способ, чтобы экземпляр QScriptEngine знал, как конвертировать QList<double>
в переменную Qt Script.
Спасибо
Вам необходимо зарегистрировать тип. Увидеть Вот
(TL, DR: использовать
qScriptRegisterSequenceMetaType< QList<double> >(_engine);
где _engine — это QScriptEngine. Хорошее время для регистрации на создание двигателя.
)
Поскольку это стандартный тип контейнера, это почти все, что вам нужно сделать.
С более сложными типами (например, вашими собственными классами) вы используете qScriptRegisterMetaType и предоставляете настраиваемые функции для перевода в и из среды движка.
Других решений пока нет …