如何用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

相关推荐
勤奋的知更鸟3 分钟前
Java编程之原型模式
java·开发语言·原型模式
珂朵莉MM16 分钟前
2021 RoboCom 世界机器人开发者大赛-高职组(初赛)解题报告 | 珂学家
java·开发语言·人工智能·算法·职场和发展·机器人
香蕉炒肉31 分钟前
Java优化:双重for循环
java·开发语言
傍晚冰川1 小时前
FreeRTOS任务调度过程vTaskStartScheduler()&任务设计和划分
开发语言·笔记·stm32·单片机·嵌入式硬件·学习
PingdiGuo_guo1 小时前
C++智能指针的知识!
开发语言·c++
黄雪超1 小时前
JVM——打开JVM后门的钥匙:反射机制
java·开发语言·jvm
我命由我123451 小时前
Spring Boot 项目集成 Redis 问题:RedisTemplate 多余空格问题
java·开发语言·spring boot·redis·后端·java-ee·intellij-idea
Rocky4011 小时前
JAVAEE->多线程:锁策略
java·开发语言·jvm
JSUITDLWXL2 小时前
ideal2022.3.1版本编译项目报java: OutOfMemoryError: insufficient memory
java·开发语言
magic 2452 小时前
Java建造者模式(Builder Pattern)详解与实践
java·开发语言·建造者模式