qt自定义标题栏,纯代码实现,拿来即用,初始化列表时传入父窗口的this指针

复制代码
// 头文件
#ifndef TITLEBAR_H
#define TITLEBAR_H

#include <QWidget>
#include <QPoint>  //坐标点
#include <QMouseEvent> //鼠标事件

class TitleBar : public QWidget
{
    Q_OBJECT
public:
    explicit TitleBar(QWidget *parent = nullptr);
    // 移动窗口的变量;
    bool m_isPressed; //鼠标按下标志
    QPoint m_startMovePos;  //开始移动的坐标点
protected:

    void mouseMoveEvent(QMouseEvent* event);
    void mousePressEvent(QMouseEvent* event);
    void mouseReleaseEvent(QMouseEvent* event);
signals:

private:
    QWidget* m_parent;
};

#endif // TITLEBAR_H
复制代码
复制代码
// 源文件
#include "titlebar.h"
#include <qDebug>
TitleBar::TitleBar(QWidget* parent)
    : QWidget(parent)
    , m_isPressed(false)  //初始化鼠标按下标志为 false
    , m_parent(parent)

{
    // 设置唯一标识符
    this->setObjectName("TitleBar");
    // 拥有子窗口自己的样式
    setAttribute(Qt::WA_StyledBackground);
}

//鼠标移动事件
void TitleBar::mouseMoveEvent(QMouseEvent* event)
{
    //判断鼠标是否按下
    if (m_isPressed)
    {
        QPoint movePoint = event->globalPos() - m_startMovePos;
        QPoint widgetPos = m_parent->pos();
        m_startMovePos = event->globalPos();
        if(m_parent)
        {
            m_parent->move(widgetPos.x() + movePoint.x(), widgetPos.y() + movePoint.y());
        }
    }
}

//鼠标按下事件
void TitleBar::mousePressEvent(QMouseEvent* event)
{
     //获取鼠标相对于软件的坐标
    QPoint _mouseCurrent_software = event->pos();
     //获取鼠标相对于桌面的坐标
    QPoint _mouseCurrent_windows = event->globalPos();

    //标题栏的宽度
    int _titleBar_width = this->width();
    //标题栏的高度
    int _titleBar_height = this->height();
    if (!isMaximized())
    {
        //判断鼠标是否在标题栏范围内
        if (_mouseCurrent_software.x()<= _titleBar_width&&_mouseCurrent_software.y()<=_titleBar_height)
        {
            m_isPressed = true;
            m_startMovePos = event->globalPos();
        }
        else
        {
            m_isPressed = false;
        }
    }
}


//鼠标释放事件
void TitleBar::mouseReleaseEvent(QMouseEvent* event)
{
    m_isPressed = false;
}
复制代码
复制代码
// 使用
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QWidget(parent)
    , m_titleBar(new TitleBar(this))
{
    // 去掉标题栏和边框
    setWindowFlags(Qt::Window | Qt::FramelessWindowHint);

    m_titleBar->show();

}

MainWindow::~MainWindow() {}
复制代码

 

效果: 鼠标左键按住移动,跟随鼠标移动。

 

posted @   雾枫  阅读(150)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
历史上的今天:
2023-02-11 QT代码进行布局,添加间隔
点击右上角即可分享
微信分享提示