gpt4 book ai didi

c++ - lua_newuserdata placement new 在 QMetaObject 上

转载 作者:搜寻专家 更新时间:2023-10-31 00:52:20 25 4
gpt4 key购买 nike

我正在尝试将 Lua 与 Qt 的 QMetaObject 系统集成。我有一个派生自 QObject 的类,我使用 QObject::staticMetaObject 根据类名绑定(bind)到 Lua。

主要.h:

#ifndef MAIN_H
#define MAIN_H

class Test : public QObject
{
Q_OBJECT
public:
Q_INVOKABLE Test(QObject *parent = 0) : QObject(parent){}

~Test(){}
};

Q_DECLARE_METATYPE(Test*)

#endif

主要.cpp

#include <QCoreApplication>
#include <QDebug>

#include "main.h"
#include "lua_src/lua.hpp" //Lua include

int CreateUserData(lua_State *L)
{
const QMetaObject *metaObject = (const QMetaObject*)lua_touserdata(L, lua_upvalueindex(1));

//PROBLEM AREA
int typeId = QMetaType::type(metaObject->className());
if(typeId != QMetaType::UnknownType)//typeId is always unknown
{
QMetaType meta(typeId);
void *ptr = lua_newuserdata(L, meta.sizeOf());
meta.construct(ptr);
}
//PROBLEM AREA

lua_newtable(L);
lua_setuservalue(L, 1);

return 1;
}

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

QString luaScript("local test = Test.new()");
lua_State *L = luaL_newstate();

//bind Test class to lua
lua_newtable(L);
lua_pushvalue(L, -1);
lua_setglobal(L, "Test");

lua_pushvalue(L, -1);
lua_pushlightuserdata(L, (void*)&Test::staticMetaObject);
lua_pushcclosure(L, CreateUserData, 1);
lua_setfield(L, -2, "new");

//start script
luaL_dostring(L, luaScript.toStdString().c_str());
lua_close(L);
}

问题是 lua 会为 userdata 分配内存,但不会构造它所代表的对象。所有文档都说使用 placement new 在 lua 用户数据的 ptr 处构造对象,但是 QMetaObject 不允许开箱即用的 placement new。

我已经包含了 ixSci 关于使用 QMetaTypeptr 构造对象的建议。但是,typeId 返回时总是未知。

最佳答案

看起来您需要的在 QMetaType 中可用类。

所以要得到你要求的东西,你需要这样的东西(未经测试!):

int typeId = QMetaType::type(metaObject->className());
if (typeId != QMetaType::UnknownType)
{
QMetaType meta(typeId);
meta.construct(ptr, objectToCopy);
}

关于c++ - lua_newuserdata placement new 在 QMetaObject 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52091746/

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