【QT】通过QT_QPA_EGLFS_KMS_CONFIG宏来解决arm32环境下QT界面设置为透明却黑屏的问题

解决arm32环境下QT界面设置为透明却黑屏的问题

问题描述

在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实际上的到的名称是什么了

在这里插入图片描述

备注

  1. 我自己是在瑞芯微芯片RK上调的。
  2. 经评论区提醒,可以通过下面的路径找到里面的connector(比如我的是DSI),这个名称后面加1之后就是/tmp/QtKMSConfig.json 中的DSI1了。另外如果还是不行的话,可以把DSI1改为UNKNOWN1,因为QT源码里面有个列表,如果这个connector的类型不在这个表里面,就会识别为UNKNOWN。
cat /sys/kernel/debug/dri/0/summary
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
QT_QPA_EGLFS_PHYSICAL_WIDTH是一个环境变量,用于设置Qteglfs模式下的物理宽度。\[1\]在使用本机API的显示指标查询操作系统时,或者在eglfs情况下,可以依靠QT_QPA_EGLFS_PHYSICAL_WIDTH来设置显示的物理宽度。\[1\]如果你想手动设置QT_QPA_EGLFS_PHYSICAL_WIDTH的值,可以使用export命令来设置环境变量,例如export QT_QPA_EGLFS_PHYSICAL_WIDTH=1024。\[2\]这样就可以将QT_QPA_EGLFS_PHYSICAL_WIDTH设置为1024。如果你在运行Qt5时遇到了关于QT_QPA_EGLFS_PHYSICAL_WIDTH的错误信息,例如"Unable to query physical screen size, defaulting to 100dpi. To override, set QT_QPA_EGLFS_PHYSICAL_WIDTH and QT_QPA_EGLFS_PHYSICAL_HEIGHT (in millimeters).",你可以尝试手动设置QT_QPA_EGLFS_PHYSICAL_WIDTH和QT_QPA_EGLFS_PHYSICAL_HEIGHT的值来解决这个问题。\[3\] #### 引用[.reference_title] - *1* [嵌入式跨平台C++3D界面开发框架最新版Qt 5.6 支持高DPI缩放](https://blog.csdn.net/AABBbaby/article/details/50946084)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Linux嵌入式开发板中执行QT程序出现的几个问题](https://blog.csdn.net/qq_43445867/article/details/126529791)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值