首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在QtScript中使用c++标准复数

如何在QtScript中使用c++标准复数
EN

Stack Overflow用户
提问于 2010-07-05 04:44:49
回答 2查看 1.2K关注 0票数 4

我尝试了解如何在QtScripts中使用复数,以便可以从QtScript调用使用复数参数定义的槽。也可以使用基本代数(+,-,exp,... )复数的数字应该是用户可以从脚本访问的。

为了说明,我想调用的是:

代码语言:javascript
复制
#include<complex>
typedef complex<double> Complex;

class MyCppClass : public QObject
{
Q_OBJECT
public:
  ...
public slots:
void mySignal(Complex rCValue); !! <<== should be callable from QtScript
  ...
}

有什么想法吗?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-05 05:00:39

我认为您必须在QtScript (类似于http://examples.oreilly.com/9781565923928/text/8-6.txt)中实现复杂代数,然后修改mySignal以接受这样的对象。

票数 1
EN

Stack Overflow用户

发布于 2010-07-06 16:20:31

这不是最终的答案。因为如上所述,运算符+、-和*不能用于javascript侧的复数。但对于那些感兴趣的人,我想分享以下代码片段,它们允许使用复杂的参数触发插槽。

test.h:

代码语言:javascript
复制
#include <QtCore>
#include <QtScript>
#include <complex>
#include <iostream>
using namespace std;
typedef complex<double> Complex;
Q_DECLARE_METATYPE(Complex)

class TestClass : public QObject
{
Q_OBJECT    
public:
    TestClass() : QObject() {};
public slots:   
    void TestOutput(Complex rValue);
};

test.cpp:

代码语言:javascript
复制
#include "test.h"
void TestClass::TestOutput(Complex rValue)
{
    cout << "received value "<< rValue << endl;
}

main.cpp:

代码语言:javascript
复制
#include "test.h"
QScriptValue toScriptValue(QScriptEngine *eng, const Complex& rValue)
{
    QScriptValue obj = eng->newObject();
    obj.setProperty("re",real(rValue));
    obj.setProperty("im",imag(rValue));
    return obj;
}

void fromScriptValue(const QScriptValue &obj, Complex& rValue)
{
    double re=obj.property("re").toNumber();
    double im=obj.property("im").toNumber();
    rValue=Complex(re,im);
}

QScriptValue constructComplex(QScriptContext *context, QScriptEngine *engine)
{
    Complex complex=Complex(2,1);
    return engine->toScriptValue(complex);
}

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    QScriptEngine eng;
    // register our custom type
    qScriptRegisterMetaType<Complex>(&eng, toScriptValue, fromScriptValue);

    TestClass *test=new TestClass;
    QObject *someObject = (QObject*)test;
    QScriptValue objectValue = eng.newQObject(someObject);
    eng.globalObject().setProperty("myObject", objectValue);

    QScriptValue val = eng.evaluate("function Complex(real, imaginary) { this.re = real; this.im = imaginary;}; cadd = function (a, b) {return new Complex(a.re + b.re, a.im + b.im);};");
    val = eng.evaluate("my_complex=new Complex(8,1); my_comp=new Complex(2,9);     my_c=cadd(my_comp,my_complex);");
    cout << "script"<< val.toString().toStdString() << endl;
    Complex cval = qscriptvalue_cast<Complex>(val);
    cout << "qscriptvalue_cast : "<< cval << endl;

    val = eng.evaluate("myObject.TestOutput(my_c)");

    return 0;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3176156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档