實(shí)現(xiàn)窗體拖動(dòng)
如果我們不使用操作系統(tǒng)自帶的標(biāo)題欄,首先就應(yīng)該將Windows標(biāo)題欄去掉,這個(gè)功能只要一條語句就能夠?qū)崿F(xiàn),那就是在構(gòu)造函數(shù)中加入setWindowsFlags(Qt::FramelessHint),但是窗體就固定不動(dòng)了,既不能拖動(dòng)也不能拉伸,下面我就介紹一種方法來實(shí)現(xiàn)窗體的拖動(dòng)。
1. 在類聲明中添加兩個(gè)私有變量:
QPoint mousePoint; //鼠標(biāo)相對(duì)于窗體的位置
bool isMousePressed; //鼠標(biāo)是否按下
2. 在類聲明中添加鼠標(biāo)移動(dòng)事件
protected:
virtual void mousePressEvent(QMouseEvent *event); //鼠標(biāo)按下事件
virtual void mouseMoveEvent(QMouseEvent *event); //窗體拖動(dòng)事件
virtual void mouseReleaseEvent(QMouseEvent *event);//鼠標(biāo)釋放事件
3. 定義鼠標(biāo)操作事件
//鼠標(biāo)按下事件
void MyWidget::mousePressEvent(QMouseEvent *event)
{
mousePoint = event->pos(); //鼠標(biāo)相對(duì)于窗體的位置
isMousePressed = true; //鼠標(biāo)按下
event->accept();
}
//窗體拖動(dòng)事件
void MyWidget::mouseMoveEvent(QMouseEvent *event)
{
//若鼠標(biāo)左鍵被按下
if(isMousePressed == true)
{
//鼠標(biāo)相對(duì)于屏幕的位置
QPoint curMousePoint = event->globalPos() - mousePoint;
//移動(dòng)主窗體位置
move(curMousePoint);
}
event->accept();
}
//鼠標(biāo)釋放事件
void MyWidget::mouseReleaseEvent(QMouseEvent *event)
{
//鼠標(biāo)未按下
isMousePressed = false;
event->accept();
}
*注:必須在頭文件加入#include <QMouseEvent>
|