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);
当前窗体的坐标 + (当前坐标 - 开始坐标)