1. 程式人生 > >QT練手專案二:滑鼠拖動視窗

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);
}