You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt6中如何在QWidget::createWindowContainer包装的QWindow上方放置半透明QWidget

Qt6中如何在QWidget::createWindowContainer包装的QWindow上方放置半透明QWidget

我懂你现在的困扰啦——用QWidget::createWindowContainer把QWindow包装成容器后,没法同时在上面放半透明的QWidget是吧?别慌,咱们一步步来搞定这个问题:

  • 统一父容器是关键
    首先得把窗口容器和半透明Widget放到同一个父控件里,这样它们才会处于同一个层级体系下。你可以创建一个主QWidget作为“容器的容器”,把createWindowContainer生成的窗口控件和你的半透明Widget都加到这个主容器中。

  • 正确设置半透明属性
    要让QWidget半透明,得做两个设置:

    1. 开启半透明背景属性:translucentWidget->setAttribute(Qt::WA_TranslucentBackground);
    2. 通过样式表设置透明背景色,比如浅灰色半透明: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一般默认支持。

备注:内容来源于stack exchange,提问作者Александр Куликов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 16:58:04