当前位置: 首页 > news >正文

Qt6.7.2下,qml中Window组件全屏加载WebEngineView实现圆角

环境:Qt6.7.2 ,windows11 ,CMake项目

前提:Windows {

        ………

        flags: Qt.Window | Qt.FramelessWindowHint  //无边框

         WebEngineView {
            id: webView
            anchors.centerIn: parent
            width: parent.width
            height: parent.height

                ……

                }

}

如果windows不是无边框的,按照网上的资料或demo基本也可以实现

但怪就怪在windows是无边框的,同时,WebEngineView是fill的,如果不是fill的,留有margin ,那直接用Rectangle的圆角,在包上WebEngineView就可以了,

网上一查都说用Rectangle的clip就可以,实践之下,其实是错的,webEngineView的渲染和graphics的不一样,clip根本不生效

废话不多说,

正确的方案是什么呢?

是给QuickWindow设置mask ---及setmask ,,具体代码如下核心代码如下:

Window {
    flags: Qt.Window | Qt.FramelessWindowHint

    color: "transparent"

    TFramelessHelper {
        id: framelessHelper

        titleBarHeight: 62  //38
    }

……

Component.onCompleted: {
        framelessHelper.applyRoundedMask(windowRadius)
    }

}

void TFramelessHelper::applyRoundedMask(int radius)
{
    Q_D(TFramelessHelper);

    if (d->window) {
        int width = d->window->width();
        int height = d->window->height();

        d->window->setColor(Qt::transparent);

        QBitmap bitmap(width, height);
        bitmap.fill(Qt::color0);

        QPainter painter(&bitmap);
        painter.setRenderHint(QPainter::Antialiasing);
        painter.setBrush(Qt::color1);
        painter.drawRoundedRect(0, 0, width, height, radius, radius);

        d->window->setMask(bitmap);
    }
}

或者main.cpp中:

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    QObject *rootObject = engine.rootObjects().value(0);
    QQuickWindow *window = qobject_cast<QQuickWindow *>(rootObject);
    if (window) {
        // 设置窗口背景透明,这样圆角外的区域就会透明
        window->setColor(Qt::transparent);
        // 创建一个圆角矩形的遮罩
        QBitmap bitmap(800, 600); // 窗口大小,需要根据实际窗口大小调整
        bitmap.fill(Qt::color0);  // 初始化为全透明

        QPainter painter(&bitmap);
        painter.setRenderHint(QPainter::Antialiasing);
        painter.setBrush(Qt::color1);
        painter.drawRoundedRect(0, 0, 800, 600, 15, 15); // 圆角半径15

        window->setMask(bitmap);
    }
 

这个及可以实现想要的效果了,但有个问题

qml中,尤其是Qt6.7中,窗口阴影一般是通过

layer.effect: MultiEffect {
                shadowEnabled: true
                shadowColor: "#40000000"
                shadowBlur: 0.6
                shadowVerticalOffset: control.offset
                shadowHorizontalOffset: control.offset
            }

去实现的,其实是内部模拟出的阴影,

如果用setMask去实现了圆角化,再想要加上阴影,就比较困难了,时间有限,目前我是没想到比较好的解决方案,当然,可以setMask一张带半透明阴影的图片也行。

http://www.dtcms.com/a/478539.html

相关文章:

  • Struts2_S2-045漏洞复现:原理详解+环境搭建+渗透实践(CVE-2017-5638)
  • 【慕伏白】Android Studio 无线调试配置
  • 厦门方易网站制作有限公司做网站对象存储
  • 【Docker】零基础上手:原理+Ubuntu/Windows GUI 安装 + 镜像源 / 目录优化
  • 网站的引导页怎么做的手机虚拟空间
  • 大连网站开发公司力推选仟亿科技有源码如何搭建网站
  • 【Java虚拟机(JVM)全面解析】从原理到面试实战、JVM故障处理、类加载、内存区域、垃圾回收
  • 高并发面试
  • 模板网站 建设 方法西安网站建设中心
  • 《早期经验:语言智能体学习的中间道路》Agent Learning via Early Experience论文深度解读
  • QT6中Commd Link Button,Dialog Button Box,Tool Button 功能与应用
  • asp做网站安全性wordpress 文章 接口
  • 关系型数据库RDBMS与非关系型数据库NoSQL区别
  • 网站建设发布wordpress主题带会员中心
  • 单元测试 vs Main方法调试:何时使用哪种方式?
  • 03--CSS基础(2)
  • Wireshark笔记-从抓包的角度分析几种客户端不能正常获取IP地址的场景
  • 企业 网站 推广wordpress文章状态
  • typescript中infer常见用法
  • 科技赋能塞上农业:宁夏从黄土地到绿硅谷的蝶变
  • 第13讲:深入理解指针(3)——数组与指针的“深度绑定”
  • 基于MATLAB的匈牙利算法实现任务分配
  • Type-C 接口充电兼容设计(针对 5V1A 需求)
  • Anaconda 学习手册记录
  • Python-适用于硬件测试的小工具
  • 第三方软件测评机构:【Locust的性能测试和负载测试】
  • 【Python】列表 元组 字典 文件
  • 简单asp网站深圳做个商城网站设计
  • OpenTelemetry 入门
  • 昆山做网站找哪家好wordpress 算数验证码