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();
}
"내가 기대했던대로 작동하지 않는다"는 것은 무엇을 의미합니까? – Mehrwolf
setText가 textChanged 신호를 내 보내면 catch 코드 (텍스트) 슬롯을 호출해야하므로 스크립트 코드에서 p.setText ('New String')을 호출하면 바랬습니다. – Tharanga