Получение «уничтожено» сигнал в Qt Script

Как правильно подключиться к QObject’s destroyed сигнал от Qt Script?

Когда я подключаюсь к нему как к вашему среднему сигналу, он не работает. Я проверил, что я удалил объект и что другие объекты QObject действительно получили сигнал, но функция сценария, к которой я подключился, не вызывается.

Ниже приведен пример, который я использую для тестирования. Наиболее важной частью является строка:

_engine.evaluate("obj.destroyed.connect(function() { debug(\"obj destroyed\") })");

Я ожидаю, что это вызовет эту функцию, когда obj уничтожен Приведенный ниже код гарантирует, что объект удаляется, когда четный цикл уже запущен, а также проверяет, что объект отправил destroyed сигнал другому QObject. Что я хочу исправить, так это чтобы скрипт вызывал функцию скрипта с debug("obj destroyed") после destroyed сигнал испускается.

ScriptTester.h:

#ifndef SCRIPTTESTER_H
#define SCRIPTTESTER_H

#include <QtScript>
#include <QtCore>

class ScriptTester: public QObject {
Q_OBJECT

public:
explicit ScriptTester(QObject *parent = 0);

private slots:
void signalTest();
void boo();

private:
QScriptEngine _engine;
};

#endif // SCRIPTTESTER_H

ScriptTester.cpp:

#include "ScriptTester.h"
static QScriptValue scriptDebug(QScriptContext *context, QScriptEngine *engine) {
Q_UNUSED(engine);
if (context->argumentCount() >= 1) {
QString msg = context->argument(0).toString();
for (int i = 1; i < context->argumentCount(); ++i) {
msg = msg.arg(context->argument(i).toString());
}
qDebug() << msg;
}
return QScriptValue();
}

ScriptTester::ScriptTester(QObject *parent) :
QObject(parent)
{
QTimer::singleShot(0, Qt::CoarseTimer, this, SLOT(signalTest()));
_engine.globalObject().setProperty("debug", _engine.newFunction(scriptDebug, 1));
}

void ScriptTester::signalTest() {
QObject *obj = new QObject(this);
_engine.globalObject().setProperty("obj", _engine.newQObject(obj));
_engine.evaluate("obj.destroyed.connect(function() { debug(\"obj destroyed\") })");
if (_engine.hasUncaughtException()) {
qDebug() << "Exception:" << _engine.uncaughtException().toString();
}
connect(obj, SIGNAL(destroyed()), this, SLOT(boo()));

QTimer *timer = new QTimer;
_engine.globalObject().setProperty("timer", _engine.newQObject(timer));
_engine.evaluate("timer.timeout.connect(function() { debug(\"timer timeout\"); obj.deleteLater(); })");
if (_engine.hasUncaughtException()) {
qDebug() << "Exception:" << _engine.uncaughtException().toString();
}

timer->setSingleShot(true);
timer->start(100);
}

void ScriptTester::boo() {
qDebug() << "was destroyed!";
}

Обратите внимание, что я не хочу взломать, как прохождение destroyed сначала код C ++, а затем вручную или с помощью скрипта, информирующего об этом. Я ищу реализацию, которая полностью выполнена в сценарии.

2

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]