Qt6中如何在QWidget::createWindowContainer包装的QWindow上方放置半透明QWidget
Qt6中如何在QWidget::createWindowContainer包装的QWindow上方放置半透明QWidget
我懂你现在的困扰啦——用QWidget::createWindowContainer把QWindow包装成容器后,没法同时在上面放半透明的QWidget是吧?别慌,咱们一步步来搞定这个问题:
统一父容器是关键
首先得把窗口容器和半透明Widget放到同一个父控件里,这样它们才会处于同一个层级体系下。你可以创建一个主QWidget作为“容器的容器”,把createWindowContainer生成的窗口控件和你的半透明Widget都加到这个主容器中。正确设置半透明属性
要让QWidget半透明,得做两个设置:- 开启半透明背景属性:
translucentWidget->setAttribute(Qt::WA_TranslucentBackground); - 通过样式表设置透明背景色,比如浅灰色半透明:
translucentWidget->setStyleSheet("background-color: rgba(128,128,128,128);");(rgba最后一位是透明度,0完全透明,255完全不透明)
- 开启半透明背景属性:
确保半透明Widget在顶层
默认情况下后添加的Widget会叠在上面,不过保险起见,你可以调用translucentWidget->raise();强制把它放到窗口容器的上方。另外要注意:别给窗口容器设置Qt::Window属性,不然它会变成独立的顶级窗口,半透明Widget就覆盖不到了。给你补全代码示例参考
结合你给出的createInGameWindow函数,调整后的代码大概是这样:void AetherEngine::createInGameWindow() { qVulkanInstance.setApiVersion(QVersionNumber(1, 0)); if (vkInit.enableValidationLayers) { // 这里补充你的验证层初始化代码 qVulkanInstance.setLayers(vkValidationLayers); } // 假设你已经创建了Vulkan窗口对象vulkanWindow QWidget* windowContainer = QWidget::createWindowContainer(vulkanWindow); windowContainer->setMinimumSize(800, 600); // 设置容器尺寸 // 创建主容器,用来承载窗口容器和半透明Widget QWidget* mainContainer = new QWidget(this); QVBoxLayout* mainLayout = new QVBoxLayout(mainContainer); mainLayout->addWidget(windowContainer); mainContainer->setLayout(mainLayout); // 创建半透明Widget QWidget* translucentWidget = new QWidget(mainContainer); translucentWidget->setAttribute(Qt::WA_TranslucentBackground); translucentWidget->setStyleSheet("background-color: rgba(255,255,255,100);"); translucentWidget->setGeometry(100, 100, 200, 200); // 自定义位置和大小 // 确保半透明Widget在最上层 translucentWidget->raise(); mainContainer->show(); }额外注意事项
- 如果需要半透明Widget穿透鼠标事件(让下面的窗口容器接收点击),可以加上
translucentWidget->setAttribute(Qt::WA_TransparentForMouseEvents); - 确保你的系统支持半透明效果:Windows要开启桌面合成,Linux用支持的窗口管理器,macOS一般默认支持。
- 如果需要半透明Widget穿透鼠标事件(让下面的窗口容器接收点击),可以加上
备注:内容来源于stack exchange,提问作者Александр Куликов
相关产品推荐
相关产品推荐

