如何用Qt实现一个无标题栏、半透明、置顶(悬浮)的窗口

在Qt框架中,要实现一个无标题栏、半透明、置顶(悬浮)的窗口,需要一些特定的设置和技巧。废话不多说,下面我将以DrawClient软件为例,介绍一下实现这种效果的四个要点。

要点一:移除标题栏(去除关闭、最小化、最大化按钮)

在窗口的构造函数中设置窗口的样式,在强调一下,一定要找构造函数中设置,否则有些平台可能无效

cpp 复制代码
setWindowFlags(Qt::FramelessWindowHint);

要点二:实现半透明效果(窗口半透明,而非控件半透明)

cpp 复制代码
setWindowOpacity(0.5);

要点三:实现置顶(悬浮)效果

加入Qt::WindowStaysOnTopHint标志

cpp 复制代码
setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);

要点四:实现窗口移动

重写mousePressEvent()mouseMoveEvent()mouseReleaseEvent()

cpp 复制代码
void mousePressEvent(QMouseEvent* event) override
{
    if (event->button() == Qt::LeftButton)
    {
        m_isDragging = true;
        m_dragPos = event->globalPos() - QWidget::pos();
    }
    QWidget::mousePressEvent(event);
}

void mouseMoveEvent(QMouseEvent* event) override
{
    if (m_isDragging)
    {
        if (!QWidget::isMaximized() && !QWidget::isFullScreen()) { QWidget::move(event->globalPos() - m_dragPos); }
    }
    QWidget::mouseMoveEvent(event);
}

void mouseReleaseEvent(QMouseEvent* event) override
{
    m_isDragging = false;
    QWidget::mouseReleaseEvent(event);
}

效果图

相关项目:https://gitee.com/xktesla/draw-client/releases

相关推荐
Quz2 小时前
QML 拖拽篇:接收拖拽与数据交换
qt
Interview Aid1124 小时前
TikTok OA 四题分享|半小时内 AC,题目基本都是实现题
java·开发语言·算法·面试·职场和发展
CoderIsArt11 小时前
C#中UI 线程与 Dispatcher
开发语言·ui·c#
AI情绪识别开源14 小时前
检信 ALLEMOTION OS 加密打包可执行程序 — 全面测试报告版本: v1.3功能测试 / 性能测试 /
开发语言·数据结构·人工智能·功能测试
「QT(C++)开发工程师」15 小时前
C++ auto 用法详解
开发语言·c++
OPEN-F15 小时前
C++STL教程:容器适配器与实用工具
开发语言·c++
yaoxin52112315 小时前
507. Java 反射 - 在 BeanFactory 中实现依赖注入
java·开发语言
OPEN-F15 小时前
C++模板教程:变参模板、折叠表达式与SFINAE
java·开发语言·c++
有点。15 小时前
C++二叉搜索树进阶
开发语言·c++