如何从基于 QObject 的 class 方法 return QList<double> 用于 Qt 脚本
How to return QList<double> from QObject-based class method for use in Qt Script
我正在 Qt 中开发一个使用 QScript 模块的应用程序。我正在处理的 class 派生自 QObject,因此它将是 "scriptable"。其中一种方法应该 return 双值列表 (QList)。当我用 class 的一个实例创建一个全局脚本对象时,使用 engine.newQObject(class_instance)),我可以很好地访问脚本对象的许多方法,表明进程正在运行。我可以从脚本中调用一个 return 是双精度的方法,但是应该 return QList 的函数保持沉默。
知道如何实现 C++ class' 方法以忠实地 return 双精度值列表吗?
代码:
Class代码(QCustomPlot源自QWidget)
class AbstractPlotWidget : public QCustomPlot
{
Q_OBJECT;
函数用于 return 双值列表:
(声明为 Q_INVOKABLE)
QList<double>
AbstractPlotWidget::keys()
{
QList<double> keyList;
QCPDataMap *data = graph()->data();
return data->keys();
}
当我运行那个函数时,我在脚本控制台中得到的是:
QVariant(QList)
我设计了以下测试函数,return是一个表示双值列表的 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;
}
当我 运行 该功能时,脚本控制台有效地显示了带有逗号分隔的双精度值的文本。
我还写了一个简单的函数 returning 一个双精度值,它也可以工作。另一个测试函数 return a QList<int>
有效。
所以我猜,QList<double>
和相应的脚本值之间没有自动转换。看起来我需要一种方法让 QScriptEngine 实例知道如何将 QList<double>
转换为 Qt 脚本变量。
谢谢
您需要注册类型。参见 here
(长话短说:使用
qScriptRegisterSequenceMetaType< QList<double> >(_engine);
其中 _engine 是一个 QScriptEngine。注册的好时机是在创建引擎时。
)
因为它是一种标准容器类型,所以您几乎只需要做这些。
对于更复杂的类型(例如您自己的 类),您可以使用 qScriptRegisterMetaType 并提供自定义函数来转换引擎环境。
我正在 Qt 中开发一个使用 QScript 模块的应用程序。我正在处理的 class 派生自 QObject,因此它将是 "scriptable"。其中一种方法应该 return 双值列表 (QList)。当我用 class 的一个实例创建一个全局脚本对象时,使用 engine.newQObject(class_instance)),我可以很好地访问脚本对象的许多方法,表明进程正在运行。我可以从脚本中调用一个 return 是双精度的方法,但是应该 return QList 的函数保持沉默。
知道如何实现 C++ class' 方法以忠实地 return 双精度值列表吗?
代码:
Class代码(QCustomPlot源自QWidget)
class AbstractPlotWidget : public QCustomPlot
{
Q_OBJECT;
函数用于 return 双值列表:
(声明为 Q_INVOKABLE)
QList<double>
AbstractPlotWidget::keys()
{
QList<double> keyList;
QCPDataMap *data = graph()->data();
return data->keys();
}
当我运行那个函数时,我在脚本控制台中得到的是: QVariant(QList)
我设计了以下测试函数,return是一个表示双值列表的 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;
}
当我 运行 该功能时,脚本控制台有效地显示了带有逗号分隔的双精度值的文本。
我还写了一个简单的函数 returning 一个双精度值,它也可以工作。另一个测试函数 return a QList<int>
有效。
所以我猜,QList<double>
和相应的脚本值之间没有自动转换。看起来我需要一种方法让 QScriptEngine 实例知道如何将 QList<double>
转换为 Qt 脚本变量。
谢谢
您需要注册类型。参见 here
(长话短说:使用
qScriptRegisterSequenceMetaType< QList<double> >(_engine);
其中 _engine 是一个 QScriptEngine。注册的好时机是在创建引擎时。 )
因为它是一种标准容器类型,所以您几乎只需要做这些。
对于更复杂的类型(例如您自己的 类),您可以使用 qScriptRegisterMetaType 并提供自定义函数来转换引擎环境。