QtScript - обратный вызов на стороне сценария через C ++ - реализация на стороне - PullRequest
1 голос
/ 11 ноября 2009

Решение может быть простым. С другой стороны, это может быть невозможно.

У меня есть базовый класс обратного вызова:

class CFCallback {
    int command_;
    int transfer_rate_;
    public:
    CFCallback(int command, int transfer_rate = 0) {
        command_ = command; transfer_rate_ = transfer_rate; }
    virtual ~CFCallback() {}
    virtual void operator()(void *data) = 0;
    int GetCommand() { return command_; }
    int GetTransferRate() { return transfer_rate_; }
};

И вот один пример получения из CFCallback:

void CFPacketVersion::InitiateVersion() {
    class InitiateVersionCB : public CFCallback {
        CFPacketVersion *visitor_;
        public:
        InitiateVersionCB(CFPacketVersion *v, int command) :
            CFCallback(command) {
            visitor_ = v;
        }
        void operator()(void *data) {
            Packet *pkt = (Packet *)data;
            unsigned char *pkt_data = pkt->GetData();
            std::string version = "";
            for(unsigned int i = 0; i < pkt->GetDataLength(); i++ )
                version+= pkt_data[i];
            delete []pkt_data;
            boost::regex rex("CFA(.*?):h(.*?),v(.*?)$");
            boost::smatch what;
            if( boost::regex_match(version, what, rex) ) {
                if(visitor_->GetModel()->GetName() != what[1].str() )
                    LCDInfo("Crystalfontz: Model mismatch");
                visitor_->SetHardwareVersion(what[2]);
                visitor_->SetFirmwareVersion(what[3]);
            }
        }
    };
    GetVersion(new InitiateVersionCB(this, 1));
}

GetVersion(CFCallback *) предоставляется скриптовому движку.

Я хочу быть в состоянии сделать то же самое, что и в InitiateVersion, но на стороне JavaScript. Это возможно?

Я знаю, что мне нужно зарегистрировать информацию мета-типа для CFCallback. Но я не знаю, возможно ли использовать указатель на CFCallback. То, что я пробовал изначально, не сработало.

Кроме того, учитывая, что CFCallback является функтором, я не уверен, как перевести это в javascript. Я полагаю, что могу сделать CFCallback a QObject и обеспечить сигнал, излучаемый operator(). Если у вас есть какие-либо советы, пожалуйста, поделитесь.

1 Ответ

2 голосов
/ 11 ноября 2009

Боюсь, это не сработает так, как вы его настроили.

Если вы хотите иметь возможность создавать обратный вызов в javascript, вам нужен QObject с доступным GetVersion (QScriptValue), который скрипт будет использовать для передачи реализации обратного вызова на основе сценариев. Обратите внимание, что обратный вызов не сможет работать с нетипизированными (void *) данными - вам нужно передать либо действительный объект QtScript, либо QObject с надлежащим интерфейсом (как в примере с Packet!)

Вы можете затем обернуть это так:

QtScript:

function mycb(packet) {
  var pkt_data = packet.getData(); // pkt_data is probably a String or custom object with proper interface so to simplify things get the version as string
  var version = pkt_data.toString();
  pkt_data.release(); // to simulate delete [] pkt_data; this is part of custom interface
  // proceed further with the regex checks

}

GetVersion(mycb); // implies that you define the GetVersion() as a property of the global object

C ++:

QScriptValue getVersion(QScriptContext *ctx, QScriptEngine *engine)
{
 void *data = ...;
 Packet pkt_data = wrapPacketData(data);
 // Packet is interface registered with QtScript or inherits QObject
 // it has methods getData(), toString() and release()
 QScriptValueList args;
 QScriptValue pkt_data_param = engine->newQObject(&pkt_data);
 args << pkt_data_param;
 QScriptValue cb = ctx->argument(0); 
 Q_ASSERT(cb.isFunction()); // we expect a function object!
 cb.call(QScriptValue(), args);
}
QScriptValue getVersionFun = engine->newFunction(getVersion);
engine->globalObject().setProperty(QLatin1String("GetVersion"), getVersionFun);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...