QT笔记之自定义窗口拖拽移动
1.QT自定义标题栏,拖拽标题栏移动窗口(只能拖拽标题,其他位置无法拖拽)
方法一:
转载:http://blog.sina.com.cn/s/blog_4ba5b45e0102e83h.html
.h文件中
//自己重新实现拖动操作
protected: void mouseMoveEvent ( QMouseEvent * event ); void mousePressEvent ( QMouseEvent * event ); void mouseReleaseEvent(QMouseEvent *); private:
//自己重新实现拖动操作
QPoint mousePosition;
bool isMousePressed;
.cpp文件中
//标题栏的长度
const static int pos_min_x = ;
const static int pos_max_x = -;
const static int pos_min_y = ;
const static int pos_max_y = ;
//自己实现的窗口拖动操作
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这个很重要,如果没有这句话即使是自定义界面成功了,界面可以拖动,但也还存在问题,那就是界面能够拖动到任务栏之下!
、 声明变量与鼠标事件
QPoint move_point; //移动的距离
bool mouse_press; //鼠标按下
//鼠标按下事件
void mousePressEvent(QMouseEvent *event);
//鼠标释放事件
void mouseReleaseEvent(QMouseEvent *event);
//鼠标移动事件
void mouseMoveEvent(QMouseEvent *event);
、定义鼠标事件
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; //更新原位置到最新的位置
}
}
这时已经可以用鼠标手动窗口到任意位置。
第二种写法:
void QxxxDlg::mousePressEvent(QMouseEvent *e)
{
if (e->button() == Qt::RightButton)
{
//右键关闭窗口
close();
} else if (e->button() == Qt::LeftButton)
{
//求坐标差,当前鼠标坐标 - 窗口左上角坐标
//frameGeometry返回窗口的矩形坐标, topLeft返回窗口左上角点的坐标
//move_point = e->globalPos() - this->frameGeometry().topLeft();
move_point = e->globalPos() - this->pos();
}
} void QxxxDlg::mouseMoveEvent(QMouseEvent *e)
{
if (e->buttons() & Qt::LeftButton)
{
move(e->globalPos()-move_point);
}
}
QT笔记之自定义窗口拖拽移动的更多相关文章
- QT 窗口拖拽移动实现
我们知道,要实现窗口移动可以直接鼠标点住窗口的标题栏实现拖拽移动,这是窗口默认的行为,在QT中的事件响应函数为moveEvent. 但是现实中经常需要鼠标点住窗口客户区域实现窗口的拖拽移动,代码实现如 ...
- iPhone手机解锁效果&&自定义滚动条&&拖拽--Clone&&窗口拖拽(改变大小/最小化/最大化/还原/关闭)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- electron-vue 窗口拖拽及自定义边框,及关闭缩小放大化方法
1.窗口的最小化按钮和关闭按钮以及标题栏自定义,不使用 electron 自身携带的原生标题栏 在src文件夹下main下index.js文件添加 mainWindow = new BrowserWi ...
- Qt之QAbstractItemView视图项拖拽(二)
一.需求说明 上一篇文章Qt之QAbstractItemView视图项拖拽(一)讲述了实现QAbstractItemView视图项拖拽的一种方式,是基于QDrag实现的,这个类是qt自己封装好了的,所 ...
- Qt之QAbstractItemView视图项拖拽(一)
一.需求说明 最近在搞视图项的拖拽,也上网查了一些资料,好多的文档都是一样的,只是被不通的网站所收录了(也有可能是被爬过去的,不明所以),不过也有一些文档写的不错,不过就是太简易,都是点睛之笔,总之功 ...
- nw.js FrameLess Window下的窗口拖拽与窗口大小控制
nw.js FrameLess Window下的窗口拖拽与窗口大小控制 很多时候,我们觉得系统的Frame框很难看,于是想自定义. 自定义Frame的第一步是在package.config文件中将fr ...
- JS实现漂亮的窗口拖拽效果(可改变大小、最大化、最小化、关闭)
转自<JS实现漂亮的窗口拖拽效果(可改变大小.最大化.最小化.关闭)>:http://www.jb51.net/article/73157.htm 这篇文章主要介绍了JS实现漂亮的窗口 ...
- Unity3D UGUI窗口拖拽
在开发UGUI时 我们时常需要做一个窗口拖拽的功能 先上代码 using UnityEngine; using UnityEngine.EventSystems; public class DragW ...
- QT窗口拖拽功能简单应用(处理dragEnterEvent和dropEvent事件,不同的事件有不同的信息,比如mimeData)
void dragEnterEvent(QDragEnterEvent *event); void dropEvent(QDropEvent *event); ui->lineEdit-> ...
随机推荐
- 转 SSIS处理导入数据时, 存在的更新, 不存在的插入
SSIS处理导入数据时, 存在的更新, 不存在的插入 分类: DTS/SSIS2006-09-10 12:43 18185人阅读 评论(22) 收藏 举报 ssissql servermicrosof ...
- oracle的用户
1:创建用户 create user zhaoyb identified by zhaoyb default tablespace HUAPUSALEDB create user 用户名 identi ...
- PAT乙级 1006. 换个格式输出整数 (15)
1006. 换个格式输出整数 (15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 让我们用字母B来表示“百” ...
- 20道C#练习题(一)1——10题
1.输入三个整数,xyz,最终以从小到大的方式输出.利用if嵌套. Console.Write("请输入x="); double x = double.Parse(Console. ...
- 【fedora】强制解除yum锁定
运行yum makecache时出现yum update时候出现Another app is currently holding the yum lock解决方法yum被锁定了. 可以通过执行 rm ...
- ==,equal,hasCode(),identifyHasCode()浅析
在java中如果我们要比较两个对象之间的关系的话有可能会用到下面的几种方法:==,equal,hasCode(),identifyHasCode(). ==用来比较对象本身是不是相同的. public ...
- 鸟哥的linux私房菜学习记录之程序管理和SElinux初探
process是进程的意思也就是说进程是正在运行的程序 将后台程序的错误信息等等输出到某个文档 终端关闭后会停止运行,如果想终端关闭后继续运行可以使用nohup命令,man nohup.
- Java常用快捷键
Ctrl+M 最大化当前的Edit或View (再按则反之) Crl+k:查找下一处 Ctrl+Shift+O 导包 Ctrl+W 关闭当前EditerCtrl+shift+W 关闭所有当前页 Ctr ...
- sqlite加密
一直使用sqlite来管理本地的数据,但是Xcode中的SDK中集成的sqlite是免费的,不提供加密模块,但是程序中用到的很多数据,有时候是不想让别人看到,一开始虑修改sqlite的源码,自己重新编 ...
- Json常见问题
1.创建包含 JSON 语法的 JavaScript 字符串: var txt = '{ "employees" : [' + '{ "firstName":& ...