QT笔记之自定义窗口拖拽移动
Posted 车臣
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT笔记之自定义窗口拖拽移动相关的知识,希望对你有一定的参考价值。
1.QT自定义标题栏,拖拽标题栏移动窗口(只能拖拽标题,其他位置无法拖拽)
方法一:
转载:http://blog.sina.com.cn/s/blog_4ba5b45e0102e83h.html
.h文件中
1 //自己重新实现拖动操作 2 protected: 3 4 void mouseMoveEvent ( QMouseEvent * event ); 5 6 void mousePressEvent ( QMouseEvent * event ); 7 8 void mouseReleaseEvent(QMouseEvent *); 9 10 private: 11 //自己重新实现拖动操作 12 QPoint mousePosition; 13 bool isMousePressed;
.cpp文件中
//标题栏的长度 const static int pos_min_x = 0; const static int pos_max_x = 800-40; const static int pos_min_y = 0; const static int pos_max_y = 20; //自己实现的窗口拖动操作 void MainWindow::mousePressEvent(QMouseEvent *event) { mousePosition = event->pos(); //只对标题栏范围内的鼠标事件进行处理 if (mousePosition.x()<=pos_min_x) return; if ( mousePosition.x()>=pos_max_x) return; if (mousePosition.y()<=pos_min_y ) return; if (mousePosition.y()>=pos_max_y) return; isMousePressed = true; } void MainWindow::mouseMoveEvent(QMouseEvent *event) { if ( isMousePressed==true ) { QPoint movePot = event->globalPos() - mousePosition; move(movePot); } } void MainWindow::mouseReleaseEvent(QMouseEvent *event) { isMousePressed=false; }
方法二:(可以拖拽窗口任意位置)
转载:http://blog.sina.com.cn/s/blog_a6fb6cc90101au8r.html
自定义界面步骤:
1.设置标题栏隐藏
//设置标题栏隐藏并设置位于顶层
setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
//可获取鼠标跟踪效果
setMouseTracking(true);
//注意:Qt::WindowStaysOnTopHint这个很重要,如果没有这句话即使是自定义界面成功了,界面可以拖动,但也还存在问题,那就是界面能够拖动到任务栏之下!
2、 声明变量与鼠标事件 QPoint move_point; //移动的距离 bool mouse_press; //鼠标按下 //鼠标按下事件 void mousePressEvent(QMouseEvent *event); //鼠标释放事件 void mouseReleaseEvent(QMouseEvent *event); //鼠标移动事件 void mouseMoveEvent(QMouseEvent *event);
3、定义鼠标事件 void LoginDialog::mousePressEvent(QMouseEvent *event) { if(event->button() == Qt::LeftButton) { mouse_press = true; //鼠标相对于窗体的位置(或者使用event->globalPos() - this->pos()) move_point = event->pos();; } } void LoginDialog::mouseMoveEvent(QMouseEvent *event) { //若鼠标左键被按下 if(mouse_press) { //鼠标相对于屏幕的位置 QPoint move_pos = event->globalPos(); //移动主窗体位置 this->move(move_pos - move_point); } } void LoginDialog::mouseReleaseEvent(QMouseEvent *event) { //设置鼠标为未被按下 mouse_press = false; }
方法三:
拖拽自定义窗口任意位置移动
转载:http://twyok.blog.163.com/blog/static/81229303201321545850433/
.h文件中
protected: void mousePressEvent(QMouseEvent *) void mouseMoveEvent(QMouseEvent* ); private: QPoint last;//保存鼠标按下的位置
.cpp文件中
void xxxDialog::mousePressEvent(QMouseEvent *e) { last = e->globalPos(); } void xxxDialog::mouseMoveEvent(QMouseEvent *e) { if(e->buttons()== Qt::LeftButton) { QPoint newpos = e->globalPos(); QPoint upleft = mapToParent(newpos - last); //计算距原位置的偏移 move(upleft); last = newpos; //更新原位置到最新的位置 } } 这时已经可以用鼠标手动窗口到任意位置。
以上是关于QT笔记之自定义窗口拖拽移动的主要内容,如果未能解决你的问题,请参考以下文章
Qt-网易云音乐界面实现-1 窗口隐藏拖拽移动,自定义标题栏