2010-07-04 13 views
4

我嘗試瞭解如何在QtScript中使用複數,從而可以從QtScript調用用複雜參數定義的槽。用戶還可以通過腳本訪問複數的基本代數(+, - ,exp,...)。如何在QtScript中使用C++ std複數

僅用於演示想我要打電話是:

#include<complex> 
typedef complex<double> Complex; 

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

任何想法?謝謝!

+0

你真的不能拼'include'? :) – 2010-07-04 20:49:50

回答

1

我認爲你必須在QtScript中實現複雜的代數(類似於http://examples.oreilly.com/9781565923928/text/8-6.txt),然後修改mySignal來接受這樣的對象。

+0

好吧,可能是這樣的路要走。但是,據我所知,沒有像ECMA-262(也稱爲Javascript)中的運算符重載這樣的東西。我希望使用一個QScriptable繼承原型包裝可以克服這一點......但似乎我運氣不好(沒有+, - ,*只是加,減,乘)。任何人都可以確認嗎? – FFox 2010-07-05 19:41:41

+0

沒錯,我還沒有想過...可悲的是,op運算重載的缺乏似乎在其他宏語言中很常見。也許你的問題很容易寫出你自己的翻譯? – mbq 2010-07-05 20:20:20

1

這不是最終的答案...因爲如上所述,操作符+, - 和*不能用於JavaScript端的複數量。但對於那些有興趣的人,我想分享下面的代碼片斷,它們允許觸發具有複雜參數的插槽。

test.h:

#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:

#include "test.h" 
void TestClass::TestOutput(Complex rValue) 
{ 
    cout << "received value "<< rValue << endl; 
} 

main.cpp中:

#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; 
} 
相關問題