本文基于 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、补充配置页面逻辑即可落地。