QML 集成 WebView 开发桌面内嵌浏览器实战

17 阅读3分钟

本文基于 Qt QML 框架搭建轻量化桌面浏览器程序,依托 QtWebEngine 组件实现网页渲染,额外集成右键菜单、系统托盘图标、访问历史记录三大实用功能。软件支持网页复制粘贴、缩放、刷新、跳转外部浏览器等常规操作,关闭窗口时不会直接退出程序,而是最小化至系统托盘,适合快速开发客户端内嵌网页容器。下文拆分源码结构、逐模块讲解实现思路。

完整 QML 源码

qml

import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import QtWebEngine 1.10
import Qt.labs.platform 1.1

ApplicationWindow {
    id: mainWin
    visible: true
    width: 1024
    height: 768
    title: "内置网页浏览器"

    // 网页渲染控件
    WebEngineView {
        id: webView
        anchors.fill: parent
        url: "https://www.qq.com"
        // 地址变更自动存入历史
        onUrlChanged: historyData.append({url: webView.url.toString()})
    }

    // 历史记录数据模型
    ListModel { id: historyData }
    // 历史列表面板,默认隐藏
    ListView {
        id: historyList
        width: parent.width
        height: 200
        model: historyData
        delegate: Text { text: url }
        visible: false
    }

    // 右键区域监听
    MouseArea {
        anchors.fill: parent
        acceptedButtons: Qt.RightButton
        onPressed: {
            if(mouse.button === Qt.RightButton)
                rightMenu.popup(mouse.x, mouse.y)
        }
    }

    // 右键快捷菜单
    Menu {
        id: rightMenu
        MenuItem { text: "复制"; onTriggered: webView.triggerWebAction(WebEngineView.Copy) }
        MenuItem { text: "粘贴"; onTriggered: webView.triggerWebAction(WebEngineView.Paste) }
        MenuItem { text: "剪切"; onTriggered: webView.triggerWebAction(WebEngineView.Cut) }
        MenuItem { text: "全选"; onTriggered: webView.triggerWebAction(WebEngineView.SelectAll) }
        MenuItem { text: "刷新页面"; onTriggered: webView.triggerWebAction(WebEngineView.Reload) }
        MenuItem { text: "放大"; onTriggered: webView.zoomFactor += 0.1 }
        MenuItem { text: "缩小"; onTriggered: webView.zoomFactor -= 0.1 }
        MenuItem { text: "外部浏览器打开"; onTriggered: Qt.openUrlExternally(webView.url) }
    }

    // 系统托盘
    SystemTrayIcon {
        id: tray
        visible: true
        icon.source: "./images/google.png"
        menu: Menu {
            MenuItem { text: "显示窗口"; onTriggered: {mainWin.show();mainWin.raise();mainWin.requestActivate()} }
            MenuItem { text: "跳转谷歌主页"; onTriggered: {webView.url="https://www.google.com";mainWin.show()} }
            MenuItem { text: "切换历史面板"; onTriggered: historyList.visible = !historyList.visible }
            MenuItem { text: "设置"; onTriggered: {} }
            MenuItem { text: "退出程序"; onTriggered: Qt.quit() }
        }
        // 单击托盘图标隐藏/显示窗口
        onActivated: reason=>{
            if(reason === SystemTrayIcon.Trigger)
                mainWin.visible ? mainWin.hide() : mainWin.show()
        }
    }

    // 点击关闭按钮隐藏而非退出
    onClosing: { close.accepted = false; mainWin.hide() }
    // 程序启动加载托盘图标
    Component.onCompleted: tray.show()
}

代码模块分步解析

1. 头文件模块导入

通过import引入 Qt 必备组件:

  • QtQuick/QtQuick.Controls:提供 QML 基础控件与窗体控件;
  • QtQuick.Layouts:布局管理(本例未使用,可拓展页面排版);
  • QtWebEngine:核心网页渲染引擎,实现 WebView;
  • Qt.labs.platform:对接操作系统底层能力,用于系统托盘开发。

2. 主窗体定义

ApplicationWindow作为程序顶层窗口,设定初始宽高 1024×768、默认显示,是所有子控件的挂载容器。

3. WebEngineView 网页容器

本项目核心控件,铺满整个窗体,默认加载谷歌首页。页面地址发生变化时触发onUrlChanged,自动将新网址写入历史数据模型。

4. 访问历史存储与展示

ListModel用来持久化所有访问链接,ListView绑定数据源渲染链接列表,默认状态隐藏,可通过托盘菜单一键切换显隐。

5. 右键菜单实现

MouseArea铺满页面,仅监听鼠标右键点击事件,点击后在鼠标坐标弹出上下文菜单。菜单集成网页原生操作接口,直接调用triggerWebAction实现复制、剪切、刷新等系统行为;缩放通过动态修改zoomFactor缩放系数实现;Qt.openUrlExternally调用系统默认浏览器打开当前网址。

6. 系统托盘功能

SystemTrayIcon生成桌面右下角托盘图标,绑定本地图标资源路径。内置右键菜单栏包含五项功能:唤醒主窗口、一键跳转指定网址、切换历史面板、预留设置入口、彻底退出软件。单击托盘图标可快捷隐藏 / 唤起主界面。

7. 窗口关闭拦截逻辑

重写onClosing事件,拦截原生关闭行为,窗口点击 × 时只做隐藏处理;程序初始化完成后自动渲染托盘图标。

总结

该示例是 Qt-QML 混合网页客户端的最简工程模板,借助 QtWebEngine 快速嵌入网页,结合系统托盘、右键菜单完善桌面端交互逻辑。基于此代码可二次开发桌面套壳浏览器、客户端内嵌 H5 工具、网页版桌面软件,只需替换默认 URL、补充配置页面逻辑即可落地。