I just tried it, and this works:
Note, I created a widget with a plain text edit and a button.
Header
{
Q_OBJECT
public:
~MyProcess() {}
public slots:
void startMyProcess(const QString& proc);
};
{
Q_OBJECT
public:
explicit Widget
(QWidget *parent
= 0);
~Widget();
public slots:
void runScript();
private:
Ui::Widget *ui;
QScriptEngine *m_engine;
};
class MyProcess : public QProcess
{
Q_OBJECT
public:
MyProcess(QObject* parent = 0) : QProcess(parent) {}
~MyProcess() {}
public slots:
void startMyProcess(const QString& proc);
};
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
public slots:
void runScript();
private:
Ui::Widget *ui;
QScriptEngine *m_engine;
};
To copy to clipboard, switch view to plain text mode
Implementation:
QScriptValue qScriptValueFromProcess(QScriptEngine *engine, const QSharedPointer<MyProcess> &object)
{
return engine->newQObject(object.data());
}
void qScriptValueToProcess(const QScriptValue &, QSharedPointer<MyProcess> &)
{
}
Q_SCRIPT_DECLARE_QMETAOBJECT
(MyProcess,
QObject*)Q_DECLARE_METATYPE(QSharedPointer<MyProcess>)
void MyProcess
::startMyProcess(const QString &proc
) {
start(proc);
}
ui(new Ui::Widget),
m_engine(new QScriptEngine)
{
ui->setupUi(this);
QScriptValue processValue = m_engine->scriptValueFromQMetaObject<MyProcess>();
m_engine->globalObject().setProperty("Process", processValue);
qScriptRegisterMetaType(m_engine, qScriptValueFromProcess, qScriptValueToProcess);
connect(ui->buttonRun, SIGNAL(clicked()), this, SLOT(runScript()));
}
Widget::~Widget()
{
delete ui;
}
void Widget::runScript()
{
QScriptValue resultValue = m_engine->evaluate(ui->textScript->toPlainText(), "test");
if(resultValue.isError())
qDebug() << "Error: " << resultValue.toString();
}
QScriptValue qScriptValueFromProcess(QScriptEngine *engine, const QSharedPointer<MyProcess> &object)
{
return engine->newQObject(object.data());
}
void qScriptValueToProcess(const QScriptValue &, QSharedPointer<MyProcess> &)
{
}
Q_SCRIPT_DECLARE_QMETAOBJECT(MyProcess, QObject*)
Q_DECLARE_METATYPE(QSharedPointer<MyProcess>)
void MyProcess::startMyProcess(const QString &proc)
{
start(proc);
}
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget),
m_engine(new QScriptEngine)
{
ui->setupUi(this);
QScriptValue processValue = m_engine->scriptValueFromQMetaObject<MyProcess>();
m_engine->globalObject().setProperty("Process", processValue);
qScriptRegisterMetaType(m_engine, qScriptValueFromProcess, qScriptValueToProcess);
connect(ui->buttonRun, SIGNAL(clicked()), this, SLOT(runScript()));
}
Widget::~Widget()
{
delete ui;
}
void Widget::runScript()
{
QScriptValue resultValue = m_engine->evaluate(ui->textScript->toPlainText(), "test");
if(resultValue.isError())
qDebug() << "Error: " << resultValue.toString();
}
To copy to clipboard, switch view to plain text mode
Bookmarks