问题描述
在arm32环境下,使用Q5.9以上的QT时,不管如何设置界面的透明属性(在样式表里设置背景颜色为透明亦或者是直接设置界面的透明属性为true),都无法使得界面透明,从而显示QT app之外的画面;而本来应该透明的部部位全部变成黑色。
在网上搜索了一圈,各种方法绕来绕去都没有解决问题。
解决方法
因为其他问题在看QT源码的时候,发现QT可以设置显示画面绘制的格式(RGB565、XRGB8888和ARGB8888等),而透明属性又是需要ARGB8888格式里面的A这个参数才能实现的。也就是说如果QT的显示格式用的是RGB565或者是XRGB8888,那么本身就没有透明属性,也就无法实现透明了。
然后再仔细看QT源码,可以发现这个显示格式是可以通过QT_QPA_EGLFS_KMS_CONFIG这个宏去设置的,接着从QT5的官方说明文档中可以找到这个宏的使用方法,这里其中用到的是第二"name"和"format",“name"的值"DSI1"是需要根据自己的设备去修改(不知道的话可以在QT源码中搜索QKmsDevice::createScreenForConnector,然后在这个函数里面将读取到的名称打印出来【具体见本文文末】),否则这个配置文件会无效;而format的值就可以设置显示的格式,这里把"format"设为"ARGB8888”,QT就可以支持透明属性了。
export QT_QPA_EGLFS_KMS_CONFIG=/tmp/QtKMSConfig.json #设置好配置文件的路径
#配置文件/tmp/QtKMSConfig.json的内容为
{
"device": "/dev/dri/card1",
"hwcursor": false,
"pbuffers": true,
"outputs": [
{
"name": "VGA1",
"mode": "off"
},
{
"name": "DSI1",
"mode": "1024x600",
"format": "ARGB8888"
}
]
}
其他
奇怪的是QT_QPA_EGLFS_KMS_CONFIG这个宏应该是在eglfs这个模式下才会使用的,但我用的linuxfb,所以应该不会用到这个宏的才对。
#我的QT环境
export QT_QPA_FB_DRM='1'
export QT_QPA_PLATFORM='linuxfb:rotation=0'
可能是QT5.9以上版本有了QT_QPA_FB_DRM这个宏,所以即使设置的是Linuxfb,但因为用到了drm显示,所以也用到了本来是eglfs模式下的宏。
此外,如果找不到QT_QPA_EGLFS_KMS_CONFIG对于的配置文件的"name"的值,可以在QT源码中搜索下面这个函数,并加上下面这个打印,再运行app,就可以通过打印看到app实际上的到的名称是什么了。
备注
- 我自己是在瑞芯微芯片RK上调的。
- 经评论区提醒,可以通过下面的路径找到里面的connector(比如我的是DSI),这个名称后面加1之后就是/tmp/QtKMSConfig.json 中的DSI1了。另外如果还是不行的话,可以把DSI1改为UNKNOWN1,因为QT源码里面有个列表,如果这个connector的类型不在这个表里面,就会识别为UNKNOWN。
cat /sys/kernel/debug/dri/0/summary