<五>--无边框窗口的拖动

在上一篇文章中,我们讲述了如何进行无边框窗口的缩放与拖动,而在一些情况下,我们的窗口只需要进行拖动也不需要改变其大小,比如:QQ的登录窗口。本来在上一篇文章中已经讲述了如何进行窗口的拖动,但是却与窗口的缩放相关的程序放在一起,下面专门单独分离出来。

窗口的拖放只涉及到鼠标事件:按下操作、释放操作和移动操作,因此只需要重写这三个函数。由于程序比较简单,并且注释也比较详细,就不作过多介绍。新建一个基类为QWidget的Qt Gui应用程序,只需修改widget.h和widget.cpp文件如下

1、widget.h文件

#ifndef WIDGET_H  
#define WIDGET_H  
  
#include <QWidget>//注意我使用的是Qt5,Qt4与Qt5的区别可以参考http://qt-project.org/wiki/Transition_from_Qt_4.x_to_Qt5  
#include<QMouseEvent>  
namespace Ui {  
class Widget;  
}  
  
class Widget : public QWidget  
{  
    Q_OBJECT  
      
public:  
    explicit Widget(QWidget *parent = 0);  
    ~Widget();  
  
    QPoint move_point; //移动的距离  
    bool mouse_press; //鼠标按下  
    //鼠标按下事件  
    void mousePressEvent(QMouseEvent *event);  
   //鼠标释放事件  
    void mouseReleaseEvent(QMouseEvent *event);  
   //鼠标移动事件  
    void mouseMoveEvent(QMouseEvent *event);  
      
private:  
    Ui::Widget *ui;  
};  
  
#endif // WIDGET_H  

2、widget.cpp文件

#include "widget.h"  
#include "ui_widget.h"  
  
Widget::Widget(QWidget *parent) :  
    QWidget(parent),  
    ui(new Ui::Widget)  
{  
    ui->setupUi(this);  
    this->setMouseTracking(false);  
     setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);//设置主窗口无边框  
}  
  
Widget::~Widget()  
{  
    delete ui;  
}  
  
void Widget::mousePressEvent(QMouseEvent *event)  
{  
    if(event->button() == Qt::LeftButton)  
     {  
        this->setMouseTracking(true);  
          mouse_press = true;  
          //鼠标相对于窗体的位置(或者使用event->globalPos() - this->pos())  
          move_point = event->pos();;  
     }  
  
}  
  
void Widget::mouseReleaseEvent(QMouseEvent *event)  
{  
    //设置鼠标为未被按下  
        mouse_press = false;  
}  
  
void Widget::mouseMoveEvent(QMouseEvent *event)  
{  
    //若鼠标左键被按下  
  //  qDebug()<<"mouse_press="<<event->globalPos();  
        if(mouse_press)  
        {  
            //鼠标相对于屏幕的位置  
            QPoint move_pos = event->globalPos();  
  
           //移动主窗体位置  
           this->move(move_pos - move_point);  
        }  
}  
文章导航