qt窗口设置透明却显示黑色,大佬救命

大白123zz 2021-04-27 02:38:04
环境:linux,qt5.6.3 交叉编译

2个窗口叠加,把上面窗口设置透明,控件不透明,结果上面窗口透明部分显示黑色,

上面窗口构造函数设置如下:
ui->setupUi(this);
setAutoFillBackground(false);
setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground,true);//设置主窗体背景透明,子控件不收影响
move(START_X+10, START_Y+45);


效果如下:圈出来的4个角应该是透明的,结果显示黑色。


我上面的窗口是218*250的矩形,然后我把窗口设置为透明,在窗口内申请一个qlable控件,控件是一个218*250,qlable控件设置背景图片为218*250,背景图片的4个角是透明色的。
4个角显示时候是透明的,那么应该显示窗口的底色,而窗口是透明的,他就应该下面窗口内容,结果它却显示黑色!!

大佬救命,请问这是怎么回事?怎么解决?
...全文
9581 31 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
2301_77444594 2023-07-25
  • 打赏
  • 举报
回复

楼主找到解决办法了吗

深情小智 2022-05-24
  • 打赏
  • 举报
回复

找到办法了,不要设置maindow的窗口sheetstyle,设置widget的并用self.ui.setAttribute(Qt.WA_TranslucentBackground) # 设置窗口背景透明

大白123zz 2022-05-24
  • 举报
回复
@深情小智 谢谢你的回复,我在顶层窗口构造函数(上面红色字体里)setAttribute把窗口设置为透明,但是他显示是黑色。我目的是:顶层窗口里申请一个控件,它4个顶角透明,这样他就显示的是顶层窗口背景颜色;把顶层窗口背景设置透明,他就显示底层窗口画面。
大白123zz 2022-05-24
  • 举报
回复
@深情小智 控件透明到顶层窗口在透明到底层窗口
深情小智 2022-06-05
  • 举报
回复
@大白123zz 我不太懂你的顶层和底层,我学的是python的pyqt(当然概念和用法是相通的),我四角出现黑色的情况是我隐藏了窗口标题,但是四角有黑色,我分析出现黑色的原因是主窗口的背景没有透明,只是窗口看不见了但是还是存在的,它挡住了窗口下的图片(桌面或者你当前窗口下的窗口),所以我的做法是让主窗口透明,然后新建一个新的框架,把所有原来在主窗口的控件(label, box)移到这个widget上,并对这个widget设置格式,这样四角就不是黑色了,因为主窗口被隐藏了
超自然祈祷 2021-10-17
  • 打赏
  • 举报
回复
楼主解决了吗
僞隬 2021-09-03
  • 打赏
  • 举报
回复 1

楼主,你这个问题解决了吗?

大白123zz 2021-09-06
  • 举报
回复
@僞隬 没有
luj_1768 2021-04-30
  • 打赏
  • 举报
回复
看上去好像是:系统非要把窗体占用的区域完全标记清楚,不然就不高兴了。
大白123zz 2021-04-29
  • 打赏
  • 举报
回复
引用 17 楼 这是一个正经昵称 的回复:
你这还挺神奇,windows linux 海思都是setAttribute Qt::WA_TranslucentBackground 或者直接改paintEvent。你的这是跑在什么上面的?是用的fb吗?哪个层
是瑞芯微的平台,显示在lcd屏幕上,就是直接显示在应用层的,不是图像层
  • 打赏
  • 举报
回复 1
你这还挺神奇,windows linux 海思都是setAttribute Qt::WA_TranslucentBackground 或者直接改paintEvent。你的这是跑在什么上面的?是用的fb吗?哪个层
反斜杠\ 2023-09-16
  • 举报
回复
@这是一个正经昵称 救命,我使用的FB,使用了setAttribute Qt::WA_TranslucentBackground,背景变成黑色了的
qq409433 2021-04-29
  • 打赏
  • 举报
回复
www1411 2021-04-29
  • 打赏
  • 举报
回复
引用 20 楼 www1411 的回复:
我也不是很清楚
,是的
www1411 2021-04-29
  • 打赏
  • 举报
回复
我也不是很清楚
赵4老师 2021-04-29
  • 打赏
  • 举报
回复
自绘是早晚要学会的技能。
星灵剑圣 2021-04-28
  • 打赏
  • 举报
回复
引用 8 楼 嵌入式_小马 的回复:
[quote=引用 5 楼 星灵剑圣 的回复:]也有可能是使用qss的原因,我的这个项目没有使用qss进行美化
我完全按照你的方法来,结果依旧没出现圆角,只是角落颜色变为了白色。 setUi函数: void setupUi(QDialog *DemoSettings) { if (DemoSettings->objectName().isEmpty()) DemoSettings->setObjectName(QStringLiteral("DemoSettings")); DemoSettings->resize(218, 250); } 构造函数: DemoSettings::DemoSettings(QWidget *parent) : QDialog(parent), ui(new Ui::DemoSettings) { ui->setupUi(this); setAutoFillBackground(false); setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint); } 显示图片: void DemoSettings::setWindowCircle() { //生成一张位图 QBitmap objBitmap(size()); //QPainter用于在位图上绘画 QPainter painter(&objBitmap); //填充位图矩形框(用白色填充) painter.fillRect(rect(),Qt::white); painter.setBrush(QColor(0,0,0)); //在位图上画圆角矩形(用黑色填充) painter.drawRoundedRect(this->rect(),10,10); //使用setmask过滤即可 setMask(objBitmap); } void DemoSettings::paintEvent(QPaintEvent *) { printf("paint\n"); setWindowCircle(); QPainter painter(this); painter.drawPixmap(QRect(0, 0, this->width(), this->height()), QPixmap(":/qrc/setting/mudo/menu_bk_s.png")); } :/qrc/setting/mudo/menu_bk_s.png这个图片是和窗口一样大小的矩形图片,4个角是透明色的。 显示结果是窗口正常,背景图片正常,但4个角依旧在,且为白色[/quote] 4个角依旧在,要么是setMask()没有成功或给错窗口了,要么是drawRoundedRect()画的矩形不对,drawRoundedRect的第二三个值是设置圆角矩形角的椭圆的半径,你可以修改一下看看如何,为白色是前面用fillRect把位图填充为白色了
大白123zz 2021-04-28
  • 打赏
  • 举报
回复
引用 5 楼 星灵剑圣 的回复:
也有可能是使用qss的原因,我的这个项目没有使用qss进行美化
我完全按照你的方法来,结果依旧没出现圆角,只是角落颜色变为了白色。 setUi函数: void setupUi(QDialog *DemoSettings) { if (DemoSettings->objectName().isEmpty()) DemoSettings->setObjectName(QStringLiteral("DemoSettings")); DemoSettings->resize(218, 250); } 构造函数: DemoSettings::DemoSettings(QWidget *parent) : QDialog(parent), ui(new Ui::DemoSettings) { ui->setupUi(this); setAutoFillBackground(false); setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint); } 显示图片: void DemoSettings::setWindowCircle() { //生成一张位图 QBitmap objBitmap(size()); //QPainter用于在位图上绘画 QPainter painter(&objBitmap); //填充位图矩形框(用白色填充) painter.fillRect(rect(),Qt::white); painter.setBrush(QColor(0,0,0)); //在位图上画圆角矩形(用黑色填充) painter.drawRoundedRect(this->rect(),10,10); //使用setmask过滤即可 setMask(objBitmap); } void DemoSettings::paintEvent(QPaintEvent *) { printf("paint\n"); setWindowCircle(); QPainter painter(this); painter.drawPixmap(QRect(0, 0, this->width(), this->height()), QPixmap(":/qrc/setting/mudo/menu_bk_s.png")); } :/qrc/setting/mudo/menu_bk_s.png这个图片是和窗口一样大小的矩形图片,4个角是透明色的。 显示结果是窗口正常,背景图片正常,但4个角依旧在,且为白色
大白123zz 2021-04-28
  • 打赏
  • 举报
回复
引用 3 楼 这是一个正经昵称 的回复:
QLabel stylesheet background设为transparent. 用SetPixmap去显示图片。 QSS在这种情况下显示背景图好像就是黑背景的。
不管我怎么设置,窗体的透明色都显示黑色。用setWindowOpacity(0.0);却又能显示透明, 可我只是想把窗体变为圆角矩形,
hitzsf 2021-04-28
  • 打赏
  • 举报
回复
这个没有办法,父控件的背景也必须透明 如果父控件置顶了,背景就会变黑,windows需要用 api 来实现,不想用api,那就截图来实现类似透明的效果
大白123zz 2021-04-28
  • 打赏
  • 举报
回复
引用 3 楼 这是一个正经昵称 的回复:
QLabel stylesheet background设为transparent. 用SetPixmap去显示图片。 QSS在这种情况下显示背景图好像就是黑背景的。
你的意思是把窗体设置为:setStyleSheet(QLatin1String("QLabel {\n"" background: transparent;\n""}\n""\n""")); 然后在申请一个qlable去显示背景图片吗? 那要不要设置 setAttribute(Qt::WA_TranslucentBackground,true); ?
星灵剑圣 2021-04-28
  • 打赏
  • 举报
回复
也有可能是使用qss的原因,我的这个项目没有使用qss进行美化
星灵剑圣 2021-04-28
  • 打赏
  • 举报
回复
引用 2 楼 嵌入式_小马 的回复:
[quote=引用 1 楼 星灵剑圣 的回复:]先用drawRoundedRect画一个圆角矩形,然后使用setmask过滤,最后把你的背景图片画上去,我是这样做圆角窗口的,你可以试试 不过我linux没怎么用过,不知道一不一样
ui->setupUi(this); setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint); QBitmap objBitmap(size()); //QPainter用于在位图上绘画 QPainter painter(&objBitmap); //填充位图矩形框(用白色填充) painter.fillRect(rect(),Qt::white); //在位图上画圆角矩形(用黑色填充) painter.setBrush(QColor(0,0,0)); painter.drawRoundedRect(this->rect(),10,10); //使用setmask过滤即可 setMask(objBitmap); this->setStyleSheet(QStringLiteral("background-image: url(:/qrc/setting/mudo/menu_bk_s.png);")); // painter.drawPixmap(QRect(0, 0, this->width(), this->height()), QPixmap(":/qrc/setting/mudo/menu_bk_s.png")); // painter.drawImage(0, 0, QImage(":/qrc/setting/mudo/menu_bk_s.png")); 大佬,这样写有2个问题,1:窗口4个角没有变成圆角。2:窗口背景是白色没有添加上背景图片,使用样式表可以添加上背景图片。 主要问题是窗口4个角还在,只是换了个颜色,4个角并没有裁去[/quote] painter.drawPixmap画背景图片时painter是要使用this指针进行初始化,并且要在paintEvent(QPaintEvent *event)函数里使用,在之前因为用了setMask(),所以在objBitmap这个位图上画背景图片是没有效果的。不过我即使这里不画上背景图片也是可以出现圆角的
  • 打赏
  • 举报
回复
QLabel stylesheet background设为transparent. 用SetPixmap去显示图片。 QSS在这种情况下显示背景图好像就是黑背景的。
大白123zz 2021-04-28
  • 打赏
  • 举报
回复
引用 1 楼 星灵剑圣 的回复:
先用drawRoundedRect画一个圆角矩形,然后使用setmask过滤,最后把你的背景图片画上去,我是这样做圆角窗口的,你可以试试 不过我linux没怎么用过,不知道一不一样
ui->setupUi(this); setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint); QBitmap objBitmap(size()); //QPainter用于在位图上绘画 QPainter painter(&objBitmap); //填充位图矩形框(用白色填充) painter.fillRect(rect(),Qt::white); //在位图上画圆角矩形(用黑色填充) painter.setBrush(QColor(0,0,0)); painter.drawRoundedRect(this->rect(),10,10); //使用setmask过滤即可 setMask(objBitmap); this->setStyleSheet(QStringLiteral("background-image: url(:/qrc/setting/mudo/menu_bk_s.png);")); // painter.drawPixmap(QRect(0, 0, this->width(), this->height()), QPixmap(":/qrc/setting/mudo/menu_bk_s.png")); // painter.drawImage(0, 0, QImage(":/qrc/setting/mudo/menu_bk_s.png")); 大佬,这样写有2个问题,1:窗口4个角没有变成圆角。2:窗口背景是白色没有添加上背景图片,使用样式表可以添加上背景图片。 主要问题是窗口4个角还在,只是换了个颜色,4个角并没有裁去
加载更多回复(6)

16,815

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧