《Qt/UI美化实战课程》第一章 无边框窗口(11讲)

《Qt/UI美化实战课程》新课首发

(1)无边框窗口(11讲)

(2)图标字体(8讲)

(3)官方图表QChart:曲线、柱状图、饼图(20+讲)

(4)第三方图表QCustomPlot:曲线、柱状图、饼图(20+讲)

(5)语法高亮(12+讲)

(6)仪表盘(10+讲)

(7)天气预报(11+讲)

(8)基础控件(15+讲)

(9)高级控件(12+讲)

(10)精美换肤(15+讲)

详情参见个人主页的置顶视频(明王出品,必属精品)

需要系统跟明王学习的小伙伴,可以直接加明王W-X:coding4096

(1)总课时:超 120+ 讲,每日更新

(2)讲课风格:从零新建项目,从零一行行写代码

(3)提供资料:视频教程+配套源码+详细笔记


1. 效果演示、技术点

本章实现的无边框窗口,支持以下特性:

✅ 支持鼠标拖拽4个边框和4个角,来缩放窗体

✅ 同时支持鼠标拖动标题栏以及标题栏之外,来移动窗体

✅ 支持双击标题栏,来实现窗口最大化和恢复

✅ 最大化状态下,拖动标题栏恢复原始大小

✅ 支持窗口固定大小,不允许缩放

本节演示下最终实现的无边框窗口的效果,如下:

2. 实现方式

之所以要自己定制无边框窗口,是因为 QT 自带的标题栏很丑,无法定制。

所以实际项目中的做法是:去除 QT 自带的标题栏,然后自己实现一个带有自定义标题栏的无边框窗口。

通常有两种做法:

(1)重载 nativeEvent() 函数

该函数拦截 Windows 系统消息(如 WM_NCHITTEST)来实现

这种方法需要了解 Windows 系统消息,并且是针对 Windows 系统的,对跨平台显然无法支持

(2)纯 QT 实现

这种方式通过处理 QT 中的一些事件,比如鼠标事件(mouseMoveEvent、mousePressEvent、mouseReleaseEvent 等),通过重载相应的事件处理函数,实现窗口的拉伸缩放、窗口移动等

这种方法是纯 QT 代码实现,支持跨平台

PS: 网上能查到的各种实现,各种小 BUG,包括但不限于:

  • 缩放窗口时,把窗口 "推走";

  • 最大化状态变为最小化后,再次恢复不是最大化状态

  • 点击标题栏后,右上角的按钮失去 "活性"

  • 右上角的按钮,鼠标悬浮上去后底纹背景无法变化

本章会从零开始、从零新建项目实现这个完善的无边框窗口,可以直接应用到商业项目中去!

相关推荐
传奇开心果编程8 小时前
【SwiftUI提高练中学】第8课 网络层架构:拦截器、重试、缓存与离线优先
学习·macos·ui·ios·swiftui
传奇开心果编程9 小时前
【现代声明式UI学与练】第7课 组件通信——父传子、子传父、跨层级通信、状态提升与 Context
学习·flutter·react native·ui·swiftui·android jetpack
大圣编蚕11 小时前
Rancher证书轮换过期导致不能访问UI问题处理
ui·rancher
可乐ea11 小时前
Agent 评测换判据:用终态数据库状态判定任务是否完成
数据库·ui·oracle·mcp工具·agent评测·终态断言·智能体可靠性
传奇开心果编程15 小时前
【Compose Multiplatform 跨端开发学与练】第3课 布局与组件
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程18 小时前
【现代声明式UI学与练】第9课 性能优化——渲染优化、列表优化、内存优化、启动优化
学习·flutter·react native·ui·性能优化·swiftui·android jetpack
传奇开心果编程19 小时前
【Compose Multiplatform 跨端开发学与练】第4课 导航与路由
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程20 小时前
【Compose Multiplatform 跨端开发学与练】第6课 状态管理与架构
android·学习·ui·ios·架构·kotlin·composer
传奇开心果编程20 小时前
【Compose Multiplatform 跨端开发学与练】第2课 Compose 基础语法
android·windows·学习·ui·ios·kotlin·composer
Quz1 天前
QML PathView:吸附对齐与环形轮播
qt