QT练手项目二:鼠标拖动窗口

     对于一个没有边框的窗口,鼠标是无法将它拖动的,于是我们就需要自己重写鼠标的点击、移动和释放事件来跟踪鼠标,从而

达到使用鼠标拖动窗口,这里我们就简单的使用一个mainwindow来演示。这个小项目代码非常少,适合用来入门QT。

     首先是对窗口做无边框设置:

     setWindowFlags(Qt::FramelessWindowHint);

     然后我们做一个退出按钮:
    m_buttonClose = new QPushButton(this);
    m_buttonClose->setText(tr("退出"));

    //连接退出功能
    connect(m_buttonClose, SIGNAL(clicked()), this, SLOT(close()));

    以上,一个简单的无框窗口就创建好了。

    我们来看看鼠标点击事件的重写:

    void MainWindow::mousePressEvent(QMouseEvent *event)
   {
        //读取坐鼠标点击坐标点
         m_lastPoint = event->globalPos();
    }

    再看看鼠标移动事件的重写:

    void MainWindow::mouseMoveEvent(QMouseEvent *event)
  {
          //把移动的位置记录下来,这是相对于上个位置的距离
        int dx = event->globalX() - m_lastPoint.x();
         int dy = event->globalY() - m_lastPoint.y();

         m_lastPoint = event->globalPos(); //更新记录点

        move(x() + dx, y() + dy); //窗口移动到此处
   }

  最后看看鼠标释放事件:

  void MainWindow::mouseReleaseEvent(QMouseEvent *event)
  {
        //记录新移动到的坐标相对于上个坐标的位置
       int dx = event->globalX() - m_lastPoint.x();
       int dy = event->globalY() - m_lastPoint.y();

       move(x() + dx, y() + dy);
    }

   到这里我们的整个小项目就已经完成啦。

  下面我就贴上所有代码吧。

   /*-------------------------------MainWindow.h--------------------------*/

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QMouseEvent>
#include <QPoint>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    //退出按钮
    QPushButton *m_buttonClose;
    //记录鼠标位置
    QPoint m_lastPoint;

protected:
    //鼠标点击事件
    void mousePressEvent(QMouseEvent *event);
    //鼠标移动事件
    void mouseMoveEvent(QMouseEvent *event);
    //鼠标释放事件
    void mouseReleaseEvent(QMouseEvent *event);
};

#endif // MAINWINDOW_H

/*------------------------------------------MainWindow.cpp---------------------------------------*/

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    //标题栏
    setWindowTitle(tr("移动无边框窗口"));
    //设置显示位置
    setGeometry(500, 300, 300, 300);
    //设置窗口为无边框.无边窗就意味着无法通过拖动鼠标移动窗口。
    //那么我们就需要自己写鼠标捕捉事件并跟随鼠标移动窗口
    setWindowFlags(Qt::FramelessWindowHint);
    //设置图标
    setWindowIcon(QIcon(":/image/icon_image.ico"));

    //实例化一个按钮,功能是退出
    m_buttonClose = new QPushButton(this);
    m_buttonClose->setText(tr("退出"));
    m_buttonClose->setFont(QFont("TImes", 20, QFont::Black));

    //连接退出功能
    connect(m_buttonClose, SIGNAL(clicked()), this, SLOT(close()));

}

MainWindow::~MainWindow()
{

}

//鼠标点击事件
void MainWindow::mousePressEvent(QMouseEvent *event)
{
    //读取坐鼠标点击坐标点
    m_lastPoint = event->globalPos();
}

//鼠标移动事件
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    //把移动的点记录下来
    int dx = event->globalX() - m_lastPoint.x();
    int dy = event->globalY() - m_lastPoint.y();

    m_lastPoint = event->globalPos(); //更新记录点

    move(x() + dx, y() + dy); //窗口移动到此处
}

void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
    //记录移动到的坐标
    int dx = event->globalX() - m_lastPoint.x();
    int dy = event->globalY() - m_lastPoint.y();

    move(x() + dx, y() + dy);
}

猜你喜欢

转载自blog.csdn.net/dzhongjie/article/details/84071227