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() {}
效果: 鼠标左键按住移动,跟随鼠标移动。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
2023-02-11 QT代码进行布局,添加间隔