一般情况下,当去掉窗体标题栏时,按住鼠标左键就无法实现拖动窗体;当去掉窗体标题栏时,窗体四周的边框也去掉了,此时按住鼠标左键拖动窗体四周边沿,无法实现鼠标拖动改变窗体大小。如下为Qt实现去掉窗体标题栏的代码:
setWindowFlag(Qt::FramelessWindowHint); // 去掉标题栏
现在的问题是:
在去掉窗体标题栏的情况下,如何在窗体上按住鼠标左键,实现移动窗体?
2.实现方法
Qt中有个QSizeGrip类,可以很好解决1节提到的问题,关于该类的具体用法,参见Qt Assistant。
代码:
private: //virtual
void mousePressEvent(QMouseEvent *e) override;
void mouseReleaseEvent(QMouseEvent *e) override;
void mouseMoveEvent(QMouseEvent *e) override;
private:
bool bLeftMousePressed{false}; //鼠标左键是否按下
QPointF mLastMousePoint; //鼠标按下时的位置
.cpp文件如下:
void Login::mousePressEvent(QMouseEvent *e){
if(Qt::LeftButton!= e->button()) return;
mLastMousePoint = e->globalPosition();
bLeftMousePressed=true;
}
void Login::mouseReleaseEvent(QMouseEvent *e){
if(Qt::LeftButton!=e->button()) return;
bLeftMousePressed =false;
}
void Login::mouseMoveEvent(QMouseEvent *e){
auto curMousePt = e->globalPosition();
auto offsetPt = curMousePt-mLastMousePoint;
move(pos().x()+offsetPt.x(),pos().y()+offsetPt.y());
mLastMousePoint=curMousePt;
}