从一个教学ppt里看到的实现
头文件
#include <QPointer>
protected:
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
cpp文件
void mousePressEvent(QMouseEvent *event) {
last = event->globalPos();
}
void mouseMoveEvent(QMouseEvent *event) {
int dx = event->globalX() - last.x();
int dy = event->globalY() - last.y();
last = event->globalPos();
move(x() + dx, y() + dy);
}
void mouseReleaseEvent(QMouseEvent *event) {
int dx = event->globalX() - last.x();
int dy = event->globalY() - last.y();
move(x() + dx, y() + dy);
}
去标题栏的flag, 写在构造函数里
this->setWindowFlags(Qt::FramelessWindowHint);
这样实现了无标题栏移动窗体.
但是实践中碰到个问题, 在窗体的控件上点击拖动鼠标同样能拖动窗口. 遇到一些button上操作还会莫名其妙窗体消失. 查阅了上面几个函数触发的细节, 发现mousePressEvent函数在点击控件时是不触发的. 由此提出改进实现.
h文件添加bool, 默认true
bool isElement = true;
重载函数代码如下
void mousePressEvent(QMouseEvent *event) {
last = event->globalPos();
isElement = false;
}
void mouseMoveEvent(QMouseEvent *event) {
if (isElement) return;
int dx = event->globalX() - last.x();
int dy = event->globalY() - last.y();
last = event->globalPos();
move(x() + dx, y() + dy);
}
void mouseReleaseEvent(QMouseEvent *event) {
if (isElement) return;
int dx = event->globalX() - last.x();
int dy = event->globalY() - last.y();
move(x() + dx, y() + dy);
isElement = true;
}
这样在控件中点击拖动鼠标就不会触发拖动窗口的效果了