在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);
}
效果图