2012-09-12 36 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來查看其輸出。然後我發現有一個錯誤,代碼被編輯成功。

任何想要一個示例原型類的人,這將是一個很好的指導原則。