如何从基于QObject的类方法返回QList <double>以在Qt脚本中使用

时间:2017-10-23 17:35:49

标签: c++ qt qscript

我正在使用QScript模块在Qt中开发一个应用程序。我正在处理的类是从QObject派生的,因此它可以编写脚本&#34;。其中一个方法应该返回一个double值列表(QList)。当我用类的一个实例创建一个全局脚本对象时,使用engine.newQObject(class_instance)),我可以完全正确地访问脚本对象的许多方法,表明该过程正在运行。我可以从脚本中调用一个返回double的方法,但是应该返回QList的函数保持静默。

任何想法如何实现C ++类&#39;方法,它会忠实地返回双值列表?

代码:

类代码(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;
    }

当我运行该函数时,脚本控制台会以逗号分隔的双精度值有效地显示文本。

我还写了一个简单的函数,返回一个double值,也可以。另一个测试函数返回QList<int>个作品。

所以我猜,QList<double>和相应的脚本值之间没有自动转换。看起来我需要一种让QScriptEngine实例知道如何将QList<double>转换为Qt Script变量的方法。

由于

1 个答案:

答案 0 :(得分:1)

您需要注册类型。见here

(TL,DR:使用

qScriptRegisterSequenceMetaType< QList<double> >(_engine);

其中_engine是QScriptEngine。注册的好时机是创建引擎。 )

因为它是标准的容器类型,所以你需要做的就是它。

使用更复杂的类型(例如您自己的类),您可以使用qScriptRegisterMetaType并提供自定义函数来与引擎环境进行转换。