尝试使用子类化的QObject作为参数执行小型脚本。
QJSEngine jsEngine;
QJSValue arg = jsEngine.newQObject(child); // Child it's subclassed QObject
QJSValue function = jsEngine.evaluate(m_childRestriction);
QJSValue result = function.call(QJSValueList() << arg);
Run Code Online (Sandbox Code Playgroud)
在销毁jsEngine时,它将为我的子对象调用delete(因为newQObject使用JavaScriptOwnership创建了它)。如何避免这种情况,如何更改arg的所有权?
脚本很简单:
function(device) {
return device.m_place >=0 && device.m_place < 16;
}
Run Code Online (Sandbox Code Playgroud)
UPD:
可以调用QQmlEngine::setObjectOwnership(child, QQmlEngine::CppOwnership);对象,因为它是静态函数。从帮助中还不清楚。认为也应该在QJSEngine。
将一个列表转换为单维数组很容易;
my_array integer[];
my_array := ARRAY(SELECT * FROM single_column_table);
Run Code Online (Sandbox Code Playgroud)
但在我的情况下,我需要将具有多个列的表转换为自定义类型对象的数组;
所以我有自定义类型
TYPE dbfile AS
(fileid integer,
deleted boolean,
name text,
parentid integer,
...
ALTER TYPE dbfile
Run Code Online (Sandbox Code Playgroud)
和数组声明为
my_files dbfile[];
-- how to cast table to array of custom types???
my_files := SELECT * FROM get_files(); -- get_files return SETOF dbfile.
Run Code Online (Sandbox Code Playgroud)
如何将表转换为自定义类型数组?
ARRAY()不起作用,因为它需要单列.
我正在尝试将对象打包为 64 字节(本地属性),并且需要保存 getter 和 setter 成员函数。
我真的很喜欢 std::function 但太大了:
sizeof(std::function<int(void)>)给出 40 个字节(VS2017,x64)。
我想弄清楚是否有任何std::function16 字节大且内部没有额外分配的精简版本?
更新:解决方案如下所示,两个成员函数需要 16 个字节 (x64)。成员函数指针变成了模板参数,因此它们什么也不拿,只存储对象指针和 vptr。
感谢@Yak。
class Property
{
public:
virtual ~Property() {}
virtual QVariant value() const = 0;
virtual void setValue(const QVariant& value) = 0;
};
template<typename TYPE,
typename CLASS,
TYPE(CLASS::*get)() const,
void(CLASS::*set)(const TYPE &)>
class PropertyValue : public Property
{
public:
PropertyValueGet() = delete;
PropertyValueGet(PropertyValueGet const& ) = delete;
PropertyValueGet& operator=(PropertyValueGet const& ) = delete;
PropertyValueGet(CLASS* object) : m_object(object) …Run Code Online (Sandbox Code Playgroud)