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