2012-09-12 16 views
0

我尝试在原型中声明一个信号,然后连接它是脚本funcition由于某些原因,它不工作,因为我希望。我的代码如下。有人能帮助我吗?在Qt脚本原型中声明一个信号

我期望的是,一旦我在脚本代码中调用p.setText('New String'),由于setText发出textChanged信号,它应该调用已经连接到脚本代码中的catchSignal(text)的插槽。

原型头

#ifndef SCRIPTACTION_H 
#define SCRIPTACTION_H 

#include <QObject> 
#include <QtScript> 

class ScriptAction : public QObject , public QScriptable 
{ 
    Q_OBJECT 

public: 
    ScriptAction(QObject *parent = 0); 

signals: 
    void textChanged(const QString changedString); 

}; 

#endif // SCRIPTACTION_H 

#include "scriptaction.h" 
#include <QAction> 

Q_DECLARE_METATYPE(QAction*) 


ScriptAction::ScriptAction(QObject *parent) : QObject(parent) 
{ 
} 

主类

#include <QApplication> 
#include <QDebug> 
#include <QAction> 
#include "scriptaction.h" 
#include <QPushButton> 

Q_DECLARE_METATYPE(QAction*) 

QScriptValue qAction_Constructor(QScriptContext *ctx, QScriptEngine *eng) 
{ 
    qDebug() << "QAction is called"; 
    if(ctx->isCalledAsConstructor()) 
    { 
     QObject *parent = ctx->argument(0).toQObject(); 
     QAction *action = new QAction("Test",parent); 
     return eng->newQObject(action, QScriptEngine::ScriptOwnership); 
    } else { 
     return QString("invalid call. Use new Constructor"); 
    } 
} 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc,argv); 
    QScriptEngine engine; 
    //Evaluating a simaple expresssion 
    qDebug() << engine.evaluate("1+2").toNumber(); 
    QPushButton button; 
    QScriptValue buttonScript= engine.newQObject(&button); 
    engine.globalObject().setProperty("button", buttonScript); 
    engine.evaluate("button.text ='Hello Text'; button.show()"); 

    //QAction Prototype 
    ScriptAction qsAction ; 
    QScriptValue script_proto = engine.newQObject(&qsAction); 
    engine.setDefaultPrototype(qMetaTypeId<QAction*>(), script_proto); 
    QScriptValue ctor = engine.newFunction(qAction_Constructor , script_proto); 
    QScriptValue metaObject = engine.newQMetaObject(&QObject::staticMetaObject, ctor); 
    engine.globalObject().setProperty("QSAction" , metaObject); 
    engine.evaluate("var p = new QSAction(button);p.textChanged.connect(catchSignal);"); 
    engine.evaluate("function catchSignal(text) { print ('PROTOTYPE SIGNAL IS CALLED ',text); } p.setText('New String'); "); 
    return app.exec(); 
} 
+2

你是什么意思,“它不工作,我希望”? – Mehrwolf

+0

我希望一旦我在脚本代码中调用p.setText('New String'),因为setText发出textChanged信号,它应该调用catchSignal(文本) – Tharanga

回答

0

我摆脱这个问题,现在我看到了信号被触发,槽被调用正常。

我所做的只是将代码移到单独的脚本文件中,并开始使用QScriptDebugger来查看其输出。然后我发现有一个错误,代码被编辑成功。

任何想要一个示例原型类的人,这将是一个很好的指导原则。