本文内容,基本参考自互联网,所以定义为转载。
我们知道360安全卫士的界面是没有外边框的,去除外边框
setWindowFlags(Qt::FramelessWindowHint);
但是去除边框之后,无法移动整个窗体,为了实现这个移动效果,需要重新实现三个函数
void mousePressEvent(QMouseEvent * e);
void mouseReleaseEvent(QMouseEvent * e);
void mouseMoveEvent(QMouseEvent * e);
对应的实现如下
void FramelessMoveWindow::mousePressEvent(QMouseEvent *e)
{
if (e->button() == Qt::LeftButton) {
mMousePoint = e->globalPos() - this->pos();
e->accept();
mDragWindow = true;
}
}
void FramelessMoveWindow::mouseReleaseEvent(QMouseEvent */*e*/)
{
mDragWindow = false;
}
void FramelessMoveWindow::mouseMoveEvent(QMouseEvent *e)
{
if (mDragWindow && (e->buttons() && Qt::LeftButton)) {
this->move(e->globalPos() - mMousePoint);
e->accept();
}
}
有人可能觉得只实现下面两个函数也是可以的
void mousePressEvent(QMouseEvent * e);
void mouseMoveEvent(QMouseEvent * e);
但是当你窗体上有别的控件接收了press事件的话,会出现窗体闪烁的情况
在构造函数里添加代码
QPushButton *button = new QPushButton(this);
button->setText("Button");
当你点击这个button的话,会发现只实现press函数和move函数,是有问题的。
关于左键单击的判断和左键移动的判断的条件处理
//左键单击
if (e->button() == Qt::LeftButton) {
}
//左键移动
if (e->buttons() && Qt::LeftButton) {
}
为什么两次判断左键的方式不一样呢?
因为在
void mouseMoveEvent(QMouseEvent *e)
里面e->button()返回的一直是QT::NoButton