Qt中拖拽窗口以改变位置的实现
来源:互联网 发布:行业分析知乎 编辑:程序博客网 时间:2024/04/29 06:05
首先,要创建一个继承自QWidget的类.因为你要实现鼠标事件处理器,而只有QWidget有这类虚函数.
class name:public QWidget
{
private:
bool shouldMove;//看是否应该改变窗口的位置
QPoint *formerMainPos;//移动前窗口的位置
QPoint *formerMousePos;//第一次按下左键时鼠标的位置
}
其次,重载mouseMoveEvent,mousePressEvent和mouseReleaseEvent这三个虚函数.想法是这样,任何一个时刻,鼠标事件只能有一种发生(系统这样想).那么,拖拽这个事件就可以想成是一个以点左键开头的,以松开左键结束的鼠标移动事件.所以,在鼠标左键按下的时候就可以假设一个拖拽事件刚开始,当松开的时候,拖拽事件结束.在这两个事件中间发生的鼠标移动事件就将触发自己设定的窗口移动函数.剩下的就是怎么实现了.给整个窗口设一个属性来表示当前是否正处于拖拽事件中(shouldMove),两个数据成员,一个代表拖拽事件开始时窗口的坐标(formerMainPos),一个表示拖拽事件开始时鼠标的坐标(formerMousePos).这两个坐标就可以供我们来设置发生拖拽事件后窗口的坐标,这个就很简单了,看下面代码就可以.
void mousePressEvent (QMouseEvent *event)
{
if (event->button()!=Qt::LeftButton) return;
shouldMove = true;
*formerMainPos = this->pos();
*formerMousePos = event->globalPos();
}
void mouseReleaseEvent(QMouseEvent *event)
{
if (event->button()!=Qt::LeftButton) return;
shouldMove = false;
}
void mouseMoveEvent ( QMouseEvent * event )
{
QPoint pos = event->globalPos();
if (shouldMove)
{
int x = pos.x()-formerMousePos->x();
int y = pos.y()-formerMousePos->y();
move(formerMainPos->x()+x,formerMainPos->y()+y);
}
}
代码没运行,不保证正确性.不过无所谓,知道是怎么回事就行了.
忘了一点,这个类要能实现这个功能,还要执行一下setMouseTracking(true)这个函数,不然不会监听鼠标移动这个事件.
- Qt中拖拽窗口以改变位置的实现
- qt实现点击输入框弹出输入面板和改变窗口的位置
- 实现控件大小、位置能随窗口的改变而改变??
- 改变浏览器窗口的大小和位置
- SetWindowPos改变窗口的位置和状态
- 改变窗口大小位置
- QT 实现点击窗口以外任何位置即关闭窗口
- Qt 获取窗口的位置和大小
- 【QT】窗口位置
- mfc 改变窗口位置大小
- QT 无边框可拖动改变size窗口实现
- Qt无边框窗口实现拖动和改变大小(修改)
- WinAPI: SetWindowPos - 改变窗口的位置与状态
- 改变CMD窗口提示符前的默认路径位置
- WinAPI: SetWindowPos - 改变窗口的位置与状态
- WinAPI: SetWindowPos - 改变窗口的位置与状态
- 改变单文档应用程序窗口的大小和位置
- 在CListView中用SetScrollPos改变滚动条的位置后,窗口中显示的内容如何也跟着移动实现。
- MVC与三层架构区别
- hdu 2458 Kindergarten (最大独立集)
- Android定制出厂默认输入法
- LNMP架设 (备忘录)
- Ubuntu 配置 Apache
- Qt中拖拽窗口以改变位置的实现
- Android中Intent的setData,setType和setDataAndType的用法
- HDU 4003Find Metal Mineral
- java.lang.OutOfMemoryError: PermGen space及其解决方法
- [存储引擎基础知识]InnoDB与MyISAM的六大区别
- C 指针学习笔记
- td表格自动换行
- 最小生成树
- HOL