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

Posted

技术标签:

【中文标题】如何从基于 QObject 的类方法返回 QList<double> 以在 Qt 脚本中使用【英文标题】:How to return QList<double> from QObject-based class method for use in Qt Script 【发布时间】:2017-10-23 17:35:48 【问题描述】:

我正在 Qt 中开发一个使用 QScript 模块的应用程序。我正在处理的类是从 QObject 派生的,因此它将是“可编写脚本的”。其中一种方法应返回双精度值列表 (QList)。当我使用类的一个实例创建一个全局脚本对象时,使用 engine.newQObject(class_instance)),我可以完美地访问脚本对象的许多方法,表明该过程正在运行。我可以从脚本中调用一个返回双精度的方法,但应该返回 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&lt;int&gt; 有效。

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

谢谢

【问题讨论】:

【参考方案1】:

您需要注册类型。见here

(TL,DR:使用

qScriptRegisterSequenceMetaType< QList<double> >(_engine);

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

因为它是一种标准容器类型,所以您几乎只需要这样做。

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

【讨论】:

做到了!非常感谢。我不知道为什么在修改我的问题后我们失去了其他贡献者的答案。谢谢大家。

以上是关于如何从基于 QObject 的类方法返回 QList<double> 以在 Qt 脚本中使用的主要内容,如果未能解决你的问题,请参考以下文章

将基于 QObject 的类导出到 DLL

pyqt5:从插槽返回 QObject

QT:将我的域对象基于 QObject 是一个好主意吗?

qt5.5里面有消息队列的类吗

如何从父级中删除 QObject

斯威夫特 ||从 API 调用返回可由其他方法使用的类