http://blog.csdn.net/aqtata/article/details/8902889#comments
设置无边框 setWindowFlags(Qt::FramelessWindowHint);
直接上代码
void TanChu::mousePressEvent(QMouseEvent * event) { qDebug() << this->pos(); if(event->button() == Qt::LeftButton) { m_dragPointion = event->globalPos() - this->pos(); // 就是鼠标现在的位置和窗口左上角的距离 m_pressPoint = event->pos(); //鼠标按下,相对窗口的位置 event->accept(); } } void TanChu::mouseMoveEvent(QMouseEvent * event) { if(event->buttons() && Qt::LeftButton) { int distance = (event->pos() - m_pressPoint).manhattanLength(); if(distance >= QApplication::startDragDistance()) { //放置用户手抖产生移动 move(event->globalPos() - m_dragPointion); event->accept(); } } }
如果不考虑跨平台,只针对Windows平台,那么我建议用Windows下的标准方法,模拟标题栏移动消息
要 #include "windows.h"
void TanChu::mouseMoveEvent(QMouseEvent * event) { if (ReleaseCapture()) SendMessage(HWND(this->winId()), WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0); event->ignore(); }
今天又发现更容易的写法 记载一下
在 mouseMoveEvent(QMouseEvent
*e) 写这么一句话
this->move(this->pos() + m_mouseDstPos - m_mouseSrcPos);
当前窗体的坐标 + (当前坐标 - 开始坐标)