Q_INVOKABLE 自动释放指针
QML与C++直接交互有两种:Q_INVOKABLE与Q_PROPERTY,
Q_INVOKABLE允许qml直接调用c++类里的成员函数,而Q_PROPERTY可以让QML直接访问C++的类成员变量.
Q_INVOKABLE方式QML引擎会获得所有权,然后一旦使用完后他就释放内存,所以通过
Q_INVOKABLE返回一个指针的方式可能会导致该指针变野指针.所以如果是指针类型数据,则还是使用Q_PROPERTY,因为Q_PROPERTY在QML中使用后并不会释放它
总结:如果你是栈变量,既不是new出来的,通过Q_INVOKABLE返回指针给QML使用,如QAbstractListModel,QML用完就给你释放了,直接程序就会崩溃。因为这个栈变量生命周期就错乱了。可以改成Q_PROPERTY
方法1 QQmlEngine::setObjectOwnership(&listModel, QQmlEngine::CppOwnership); 强制必须CPP管理生命周期
方法2 使用Q_PROPERTY
Q_INVOKABLE 修饰函数不能在构造函数中使用,因为反射没完成,会导致奇奇怪怪错误
Q_INVOKABLE 返回自定义,需要注册自定义qRegisterMetaType<MapModel*>(“MapModel*”);
windows QtQuick 闪频
换成opengl渲染引擎
QML 透明图层,层次错乱
手动指定z,只有半透明图层会错乱
QObject继承的对象不允许拷贝
每个 QObject 对象都可能有一个父对象和多个子对象,以及信号和槽的连接。如果允许复制 QObject,将会复杂化这些关系的管理。例如,复制一个对象时,复制的对象是否应该连接到原对象的信号和槽?复制的对象的子对象应该如何处理?为了避免这些复杂性,Qt设计中决定不允许复制 QObject。
方法:使用指针放到数组里面
QObject继承的对象new出来无法正确删除
不要在继承了QObject的构造函数里面做多余的动作! 原因不知道!
QML Clip属性bug
- 现象1 如果ListView的header中有clip属性和ListView的clip属性都存在,header会失效。会根据渲染引擎不同,如windows下openGL渲染引擎必现。
- 现象2:其他clip属性重复,如parent有clip自己也有clip就会出错
clip不要功能重复。ListView中把header中的clip删除。换其他方式。