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; //更新原位置到最新的位置 } } 这时已经可以用鼠标手动窗口到任意位置。
第二种写法:
1 void QxxxDlg::mousePressEvent(QMouseEvent *e) 2 { 3 if (e->button() == Qt::RightButton) 4 { 5 //右键关闭窗口 6 close(); 7 } 8 9 else if (e->button() == Qt::LeftButton) 10 { 11 //求坐标差,当前鼠标坐标 - 窗口左上角坐标 12 //frameGeometry返回窗口的矩形坐标, topLeft返回窗口左上角点的坐标 13 //move_point = e->globalPos() - this->frameGeometry().topLeft(); 14 move_point = e->globalPos() - this->pos(); 15 } 16 } 17 18 void QxxxDlg::mouseMoveEvent(QMouseEvent *e) 19 { 20 if (e->buttons() & Qt::LeftButton) 21 { 22 move(e->globalPos()-move_point); 23 } 24 }