Как вернуть QList<double> из метода класса на основе 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.

Спасибо

1 ответ

Решение

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

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

qScriptRegisterSequenceMetaType< QList<double> >(_engine);

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

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

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

Другие вопросы по тегам