qt设置文本背景透明_Hi3536 怎么将qt显示背景设置成透明或者去掉

本文档介绍了如何在Hi3536平台上通过初始化程序和QT程序,实现QT显示背景的透明化。涉及到的关键步骤包括系统的初始化、视频缓冲区配置、设备及层的启动,并详细讲解了设置背景透明的相关操作,如设置颜色键和Alpha通道。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Hi3536初始化程序和qt程序是分开运行的,下面是Hi3536初始化程序

HI_S32 s32Ret = HI_SUCCESS;

pthread_t phifb0 = -1;

HI_BOOL done = 0;

HI_U32 u32PicWidth  = WIDTH;

HI_U32 u32PicHeight = HEIGHT;

SIZE_S  stSize;

VO_LAYER VoLayer = SAMPLE_VO_LAYER_VHD0;

VO_DEV VoDev = SAMPLE_VO_DEV_DHD0;

VO_PUB_ATTR_S stPubAttr;

VO_VIDEO_LAYER_ATTR_S stLayerAttr;

HI_U32 u32VoFrmRate;

VB_CONF_S stVbConf;

HI_U32 u32BlkSize;

struct fb_var_screeninfo stVarInfo;

HI_CHAR file[12] = "/dev/fb0";

HI_S32 fd;

HI_BOOL bEnable;

HIFB_DDRZONE_S stDDRZonePara;

HIFB_LAYER_INFO_S stLayerinfo;

HIFB_COLORKEY_S stColorKey;

HIFB_ALPHA_S stAlpha;

HI_BOOL bShow;

signal(SIGINT, SAMPLE_HIFB_HandleSig);

signal(SIGTERM, SAMPLE_HIFB_HandleSig);

/******************************************

step  1: init variable

******************************************/

memset(&stVbConf,0,sizeof(VB_CONF_S));

u32BlkSize = CEILING_2_POWER(u32PicWidth,SAMPLE_SYS_ALIGN_WIDTH) * CEILING_2_POWER(u32PicHeight,SAMPLE_SYS_ALIGN_WIDTH) * 2;

stVbConf.u32MaxPoolCnt = 128;

stVbConf.astCommPool[0].u32BlkSize = u32BlkSize;

stVbConf.astCommPool[0].u32BlkCnt =  6;

/******************************************

step 2: mpp system init.

******************************************/

s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf);

if (HI_SUCCESS != s32Ret)

{

SAMPLE_PRT("system init failed with %d!\n", s32Ret);

goto SAMPLE_HIFB_NoneBufMode_0;

}

stPubAttr.enIntfSync = VO_OUTPUT_1080P60;

stPubAttr.enIntfType = VO_INTF_HDMI;

stPubAttr.u32BgColor = 0x00ff00;

stLayerAttr.bClusterMode = HI_FALSE;

stLayerAttr.bDoubleFrame = HI_FALSE;

stLayerAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420;

s32Ret = SAMPLE_COMM_VO_GetWH(stPubAttr.enIntfSync,&stSize.u32Width,\

&stSize.u32Height,&u32VoFrmRate);

if (HI_SUCCESS != s32Ret)

{

SAMPLE_PRT("get vo wh failed with %d!\n", s32Ret);

goto SAMPLE_HIFB_NoneBufMode_0;

}

memcpy(&stLayerAttr.stImageSize,&stSize,sizeof(stSize));

stLayerAttr.u32DispFrmRt = 60;

stLayerAttr.stDispRect.s32X = 0;

stLayerAttr.stDispRect.s32Y = 0;

stLayerAttr.stDispRect.u32Width = stSize.u32Width;

stLayerAttr.stDispRect.u32Height = stSize.u32Height;

s32Ret = SAMPLE_COMM_VO_StartDev(VoDev, &stPubAttr);

if (HI_SUCCESS != s32Ret)

{

SAMPLE_PRT("start vo dev failed with %d!\n", s32Ret);

goto SAMPLE_HIFB_NoneBufMode_0;

}

s32Ret = SAMPLE_COMM_VO_StartLayer(VoLayer, &stLayerAttr);

if (HI_SUCCESS != s32Ret)

{

SAMPLE_PRT("start vo layer failed with %d!\n", s32Ret);

goto SAMPLE_HIFB_NoneBufMode_1;

}

if (stPubAttr.enIntfType & VO_INTF_HDMI)

{

s32Ret = SAMPLE_COMM_VO_HdmiStart(stPubAttr.enIntfSync);

if (HI_SUCCESS != s32Ret)

{

SAMPLE_PRT("start HDMI failed with %d!\n", s32Ret);

goto SAMPLE_HIFB_NoneBufMode_2;

}

}

/* 1. open framebuffer device overlay 0 */

fd = open(file, O_RDWR, 0);

if(fd < 0)

{

SAMPLE_PRT("open %s failed!\n", file);

return HI_NULL;

}

bShow = HI_FALSE;

if (ioctl(fd, FBIOPUT_SHOW_HIFB, &bShow) < 0)

{

SAMPLE_PRT("FBIOPUT_SHOW_HIFB failed!\n");

return HI_NULL;

}

HIFB_POINT_S stPoint = {0, 0};

if (ioctl(fd, FBIOPUT_SCREEN_ORIGIN_HIFB, &stPoint) < 0)

{

printf("set screen original show position failed!\n");

close(fd);

return -1;

}

stAlpha.bAlphaEnable = HI_FALSE;//HI_TRUE;

stAlpha.bAlphaChannel = HI_FALSE;//0;

stAlpha.u8Alpha0 = 0x0;

stAlpha.u8Alpha1 = 0xff;

stAlpha.u8GlobalAlpha = 0x80;

if (ioctl(fd, FBIOPUT_ALPHA_HIFB,  &stAlpha) < 0)

{

SAMPLE_PRT("Set alpha failed!\n");

close(fd);

return HI_NULL;

}

stColorKey.bKeyEnable = HI_TRUE;

stColorKey.u32Key = 0x0;

if (ioctl(fd, FBIOPUT_COLORKEY_HIFB, &stColorKey) < 0)

{

SAMPLE_PRT("FBIOPUT_COLORKEY_HIFB!\n");

close(fd);

return HI_NULL;

}

s32Ret = ioctl(fd, FBIOGET_VSCREENINFO, &stVarInfo);

if(s32Ret < 0)

{

SAMPLE_PRT("FBIOGET_VSCREENINFO failed!\n");

close(fd);

return HI_FAILURE;

}

stVarInfo.red = s_r32;

stVarInfo.green = s_g32;

stVarInfo.blue = s_b32;

stVarInfo.transp = s_a32;

stVarInfo.bits_per_pixel = 32;

stVarInfo.xres = WIDTH;

stVarInfo.yres = HEIGHT;

stVarInfo.activate = FB_ACTIVATE_NOW;

stVarInfo.xres_virtual = WIDTH;

stVarInfo.yres_virtual = HEIGHT;

stVarInfo.xoffset = 0;

stVarInfo.yoffset = 0;

s32Ret = ioctl(fd, FBIOPUT_VSCREENINFO, &stVarInfo);

if(s32Ret < 0)

{

SAMPLE_PRT("FBIOPUT_VSCREENINFO failed!\n");

close(fd);

return HI_FAILURE;

}

bShow = HI_TRUE;

if (ioctl(fd, FBIOPUT_SHOW_HIFB, &bShow) < 0)

{

SAMPLE_PRT("FBIOPUT_SHOW_HIFB failed!\n");

return HI_NULL;

}

while(!done)

{

usleep(200 * 1000);

}

SAMPLE_HIFB_NoneBufMode_2:

SAMPLE_COMM_VO_StopLayer(VoLayer);

SAMPLE_HIFB_NoneBufMode_1:

SAMPLE_COMM_VO_StopDev(VoDev);

SAMPLE_HIFB_NoneBufMode_0:

SAMPLE_COMM_SYS_Exit();

return HI_SUCCESS;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值