Qt——自定义标题栏——重写标题栏和鼠标事件,移动窗口

头文件加入这两句:

复制代码
#include <QPoint>  //坐标点
#include <QMouseEvent> //鼠标事件

public:
    // 移动窗口的变量;
    bool m_isPressed; //鼠标按下标志
    QPoint m_startMovePos;  //开始移动的坐标点
protected:

    void mouseMoveEvent(QMouseEvent* event);
    void mousePressEvent(QMouseEvent* event);
    void mouseReleaseEvent(QMouseEvent* event);
复制代码

 

源文件实现:

复制代码
DefinedTitleBar::DefinedTitleBar(QWidget* parent)
    : QWidget(parent)
    , m_isPressed(false)  //初始化鼠标按下标志为 false

{

}

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

 }

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

     int _titleBar_width = ui.widget_titleBar->width();  //标题栏的宽度
     int _titleBar_height = ui.widget_titleBar->height(); //标题栏的高度
     if (!isMaximized())
     {    
         //判断鼠标是否在标题栏范围内,如果在标题栏附近才能移动(标题栏 是拖到ui界面的 QFrame)
         if (_mouseCurrent_software.x()<= _titleBar_width&&_mouseCurrent_software.y()<=_titleBar_height)   
         {
             m_isPressed = true;
             m_startMovePos = event->globalPos();
         }
         else
         {
             m_isPressed = false;
         }
         
     }
    
 }



 void DefinedTitleBar::mouseReleaseEvent(QMouseEvent* event)  //鼠标释放事件
 {
     m_isPressed = false;
     qDebug() << QString::fromLocal8Bit("鼠标释放:") << endl
         <<endl << QString::fromLocal8Bit("鼠标相对于软件的坐标是:")  
         <<"(" << event->pos() << ")" << endl;    //pos 相对于软件


     qDebug() << QString::fromLocal8Bit("鼠标相对于桌面的坐标是:") 
         << "(" << event->globalPos() << ")"   //globalPos 相对于桌面

         << endl<<endl<<endl<<endl;
     
 }
复制代码

 

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