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

相关推荐
QX_hao1 小时前
【Go】--反射(reflect)的使用
开发语言·后端·golang
inferno1 小时前
Maven基础(二)
java·开发语言·maven
我是李武涯2 小时前
从`std::mutex`到`std::lock_guard`与`std::unique_lock`的演进之路
开发语言·c++
史不了3 小时前
静态交叉编译rust程序
开发语言·后端·rust
读研的武3 小时前
DashGo零基础入门 纯Python的管理系统搭建
开发语言·python
Andy3 小时前
Python基础语法4
开发语言·python
但要及时清醒3 小时前
ArrayList和LinkedList
java·开发语言
孚亭4 小时前
Swift添加字体到项目中
开发语言·ios·swift
hweiyu004 小时前
Go、DevOps运维开发实战(视频教程)
开发语言·golang·运维开发