Как вернуть QList & lt; double & gt; из метода класса QObject для использования в Qt Script

Я разрабатываю приложение в Qt, которое использует модуль QScript. Класс, над которым я работаю, является производным от QObject, поэтому он будет «сценарием». Один из методов должен возвращать список двойных значений (QList). Когда я создаю глобальный объект сценария с одним экземпляром класса, используя engine.newQObject (class_instance)), я могу получить прекрасный доступ к ряду методов объекта сценария, показывая, что процесс работает. Я могу вызвать из скрипта метод, который возвращает значение типа double, но функция, которая должна вернуть QList, хранит молчание.

Любая идея, как я мог бы реализовать метод класса C ++, чтобы он верно вернул этот список двойных значений?

Код:

Код класса (QCustomPlot является производным от QWidget)

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.

Спасибо

0

Решение

Вам необходимо зарегистрировать тип. Увидеть Вот

(TL, DR: использовать

qScriptRegisterSequenceMetaType< QList<double> >(_engine);

где _engine — это QScriptEngine. Хорошее время для регистрации на создание двигателя.
)

Поскольку это стандартный тип контейнера, это почти все, что вам нужно сделать.

С более сложными типами (например, вашими собственными классами) вы используете qScriptRegisterMetaType и предоставляете настраиваемые функции для перевода в и из среды движка.

1

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

Других решений пока нет …

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