一、Qt Widgets 问题交流
1.QOpenGLWidgets 窗口透明
参照 Qt 文档描述:https://doc.qt.io/qt-5/qopenglwidget.html
文档机翻:
将其他小部件放在下面并使 QOpenGLWidget 透明不会导致预期的结果:下面的小部件将不可见。这是因为实际上 QOpenGLWidget 是在所有其他常规的非 OpenGL 小部件之前绘制的,因此透视类型的解决方案是不可行的。其他类型的布局,例如在 QOpenGLWidget 顶部具有小部件,将按预期运行。
在绝对必要时,可以通过在QOpenGLWidget上设置Qt::WA_AlwaysStackOnTop属性来克服此限制。但是请注意,这会破坏堆叠顺序,例如,在 QOpenGLWidget 顶部不可能有其他小部件,因此只应在需要半透明 QOpenGLWidget 和下方可见其他小部件的情况下使用它。
请注意,当下面没有其他小部件并且打算拥有一个半透明窗口时,这不适用。在这种情况下,在顶级窗口上设置Qt::WA_TranslucentBackground的传统方法就足够了。请注意,如果透明区域被QOpenGLWidget唯一需要的话,那么Qt的:: WA_NoSystemBackground将需要转回false启用后的Qt :: WA_TranslucentBackground。此外,根据系统,也可能需要通过setFormat ()为 QOpenGLWidget 的上下文请求 alpha 通道。
默认状态下,QOpenGLWidget 窗口渲染透明时会显示为黑色。下图红色和蓝色为 QWidget 部件,分别置于底层和顶层,绿色三角为 QOpenGLWidget 部件。
给 QOpenGLWidget 设置 setAttribute(Qt::WA_AlwaysStackOnTop) 后,虽然透明有了,但是会浮在所有 QWidget 上层。即文档说的破坏了堆叠顺序。
顶层窗口设置 setAttribute(Qt::WA_TranslucentBackground) 后,虽然堆叠顺序有了,但是透明部分直接穿透了。
目前没找到好的透明方案。
二、Qt Quick 问题交流
1.QML 文件有中文赋值,在使用该组件时显示 M300
如果在自定义的 QML 组件文件中对属性赋值中文字符串,那么可能会出现 M300 的警告,这样会影响到其他的智能提示。将 QML 文件编码从无 BOM UTF8 改为带 BOM UTF8 之后,Qt Creator 的 QML 编辑器就能正常解析不出现 M300 警告了。
在新出的 QtCreator 6 中,此问题以得到解决,不用设置 BOM 了。
2.部分基本类型作为 Qt 容器数据类型进行实例化后,不能在 QML 中识别
报错信息如下:
Error: Unknown method return type: QList<qint64>
需要注册元对象类型:
qRegisterMetaType<QList<qint64>>("QList<qint64>");
此外,高版本对 c++ 类型的支持比低版本更好一点,比如上面的 QList<qint64> ,在 Qt5.9.9 中打印如下:
qml: object QVariant(QList<qlonglong>)
而在 Qt5.15.2 中可以输出列表中的值:
qml: object [222]
3.QML 与 C++ 之间 int 和 qint64 的传递
JS 的数值都是 number 双精度类型,传递给 C++ 函数的 int 和 int64 函数参数时,int 会向下取整,qint64 会四舍五入。
var a = 16777215
var b = 281474976710655
obj.testWirte(a, b)
obj.testWirte(a+0.8, b+0.8)
obj.testWirte(a+0.2, b+0.2)
obj.testWirte(a-0.8, b-0.8)
obj.testWirte(a-0.2, b-0.2)
CppObject::testWirte 16777215 281474976710655
CppObject::testWirte 16777215 281474976710655
CppObject::testWirte 16777215 281474976710656
CppObject::testWirte 16777215 281474976710655
CppObject::testWirte 16777214 281474976710654
CppObject::testWirte 16777214 281474976710655
三、其他
1.