gpt4 book ai didi

c++ - QtScript——通过 C++ 端实现的脚本端回调

转载 作者:行者123 更新时间:2023-11-30 04:40:10 26 4
gpt4 key购买 nike

解决方案可能很简单。话又说回来,这可能是不可能的。

我有基础回调类:

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 成为 QObject 并提供从 operator() 发出的信号。如果您有任何提示,请分享。

最佳答案

恐怕它不会按照您设置的方式工作。

如果您希望能够在 javascript 中创建回调,您需要一个具有可访问的 GetVersion(QScriptValue) 的 QObject,脚本将使用它来传递基于脚本的回调实现。但请注意,回调将无法处理未类型化 (void*) 数据 - 您需要传递有效的 QtScript 对象或具有适当接口(interface)的 QObject(例如示例中的 Packet one!)

然后你可以像这样把它包起来:

Qt脚本:

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);

关于c++ - QtScript——通过 C++ 端实现的脚本端回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1712411/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com