《QT实用小工具·四十一》无边框窗口

2024-04-25 21:44

本文主要是介绍《QT实用小工具·四十一》无边框窗口,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、概述
源码放在文章末尾

该项目实现了无边框窗口效果,项目demo如下所示:
在这里插入图片描述

项目代码如下所示:

#include "framelesswindow.h"
#include <QGuiApplication>
#include <QScreen>#ifdef Q_OS_WIN
#include <windowsx.h>
#endifFramelessWindow::FramelessWindow(QWindow *parent): QQuickWindow (parent)
{setFlags(flags() | Qt::FramelessWindowHint);#ifdef Q_OS_WINHWND hwnd = reinterpret_cast<HWND>(winId());LONG style = GetWindowLong(hwnd, GWL_STYLE);SetWindowLongPtr(hwnd, GWL_STYLE, style | WS_MAXIMIZEBOX | WS_THICKFRAME | WS_CAPTION);
#endif//在这里改变默认移动区域//只有鼠标在移动区域内,才能移动窗口connect(this, &QQuickWindow::widthChanged, this, [this](int arg){m_moveArea.setWidth(arg - 16);});
}bool FramelessWindow::resizable() const
{return m_resizable;
}void FramelessWindow::setResizable(bool resizable)
{if (m_resizable != resizable) {m_resizable = resizable;emit resizableChanged();}
}bool FramelessWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
#ifdef Q_OS_WINMSG* msg = reinterpret_cast<MSG*>(message);switch(msg->message) {case WM_NCCALCSIZE:{*result = 0;return true;}case WM_NCHITTEST:{auto x = GET_X_LPARAM(msg->lParam) - this->x();auto y = GET_Y_LPARAM(msg->lParam) - this->y();auto w = width();auto h = height();if (m_resizable) {if (x >= 0 && x <= 8 && y >= 0 && y <= 8) {*result = HTTOPLEFT;return true;} else if (x > 8 && x < (w - 8) && y >= 0 && y <= 8) {*result = HTTOP;return true;} else if (x >=(w - 8) && x <= w && y >= 0 && y <= 8) {*result = HTTOPRIGHT;return true;} else if (x >= 0 && x <= 8 && y > 8 && y < (h - 8)) {*result = HTLEFT;return true;} else if (x >=(w - 8) && x <= w && y > 8 && y < (h - 8)) {*result = HTRIGHT;return true;} else if (x >= 0 && x <= 8 && y >= (h - 8) && y <= h) {*result = HTBOTTOMLEFT;return true;} else if (x > 8 && x < (w - 8) && y >= (h - 8) && y <= h) {*result = HTBOTTOM;return true;} else if (x >=(w - 8) && x <= w && y >= (h - 8) && y <= h) {*result = HTBOTTOMRIGHT;return true;}}if (m_moveArea.contains(x, y)){*result = HTCAPTION;return true;} else {*result = HTCLIENT;return true;}}default:break;}
#endifreturn QQuickWindow::nativeEvent(eventType, message, result);
}

源码下载

这篇关于《QT实用小工具·四十一》无边框窗口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/935875

相关文章

sqlite3 命令行工具使用指南

《sqlite3命令行工具使用指南》本文系统介绍sqlite3CLI的启动、数据库操作、元数据查询、数据导入导出及输出格式化命令,涵盖文件管理、备份恢复、性能统计等实用功能,并说明命令分类、SQL语... 目录一、启动与退出二、数据库与文件操作三、元数据查询四、数据操作与导入导出五、查询输出格式化六、实用功

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文

Qt如何实现文本编辑器光标高亮技术

《Qt如何实现文本编辑器光标高亮技术》这篇文章主要为大家详细介绍了Qt如何实现文本编辑器光标高亮技术,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录实现代码函数作用概述代码详解 + 注释使用 QTextEdit 的高亮技术(重点)总结用到的关键技术点应用场景举例示例优化建议

Qt 设置软件版本信息的实现

《Qt设置软件版本信息的实现》本文介绍了Qt项目中设置版本信息的三种常用方法,包括.pro文件和version.rc配置、CMakeLists.txt与version.h.in结合,具有一定的参考... 目录在运行程序期间设置版本信息可以参考VS在 QT 中设置软件版本信息的几种方法方法一:通过 .pro

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

SQLite3命令行工具最佳实践指南

《SQLite3命令行工具最佳实践指南》SQLite3是轻量级嵌入式数据库,无需服务器支持,具备ACID事务与跨平台特性,适用于小型项目和学习,sqlite3.exe作为命令行工具,支持SQL执行、数... 目录1. SQLite3简介和特点2. sqlite3.exe使用概述2.1 sqlite3.exe

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件