2012-09-12 2 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

setText가 textChanged 신호를 내 보내면 catch 코드 (텍스트) 슬롯을 호출해야하므로 스크립트 코드에서 p.setText ('New String')을 호출하면 바랬습니다. – Tharanga

답변

0

내가 문제를 제거있어, 지금은 신호가 트리거되고 있으며 슬롯이라고 볼 정확히.

나는 코드를 별도의 스크립트 파일로 옮기고 QScriptDebugger를 사용하여 출력을 보았습니다. 그런 다음 오류가 있었고 코드가 편집되도록 수정되었습니다.

예제 프로토 타입 클래스를 원하는 사람이라면 좋은 지침이 될 것입니다.

관련 문제