- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试将 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 关于使用 QMetaType
在 ptr
构造对象的建议。但是,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/
什么时候在 C 中分配 Lua gc 内存 void *lua_newuserdata (lua_State *L, size_t size); ?当 Lua 中不再有引用指向它时,还是我必须注意删除
如何释放 lua_newuserdata 分配的内存? 我有一个名为Foo的类,这个类有一个构造函数和一个析构函数,我需要同时执行这两个,但我不知道如何使用C++运算符delete,因为我没有使用ne
我正在尝试将 Lua 与 Qt 的 QMetaObject 系统集成。我有一个派生自 QObject 的类,我使用 QObject::staticMetaObject 根据类名绑定(bind)到 Lu
下面的例子只是为了演示问题;实际上我有创建功能并返回许多不同的用户数据对象,在其中一些之间我可能想调用 Lua 垃圾收集器。 此外,我使用的是 Lua 5.3.3 版,它在 Windows 和 Lin
我是一名优秀的程序员,十分优秀!