0

プロトタイプで信号を宣言してみたところ、なんらかの理由でスクリプト機能に接続しても思ったように動作しませんでした。私のコードは次のとおりです。誰かがこれで私を助けることができますか?

私が期待したのは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();
}
4

1 に答える 1

0

この問題を解決しました。信号がトリガーされ、スロットが適切に呼び出されていることがわかります。

コードを別のスクリプトファイルに移動し、QScriptDebuggerを使用してその出力を確認するだけでした。次に、エラーが発生し、コードが機能するように編集されていることがわかりました。

プロトタイプクラスの例が必要な人は、これが良いガイドラインになることを願っています。

于 2012-09-14T08:15:48.540 に答える