Qt:移动无边框窗体
来源:互联网 发布:brpc 知乎 编辑:程序博客网 时间:2024/05/16 00:36
移动无边框窗体的代码网上很多,其原理都是一样的,但是是有问题的,我这里只是对其修正一下
网上的代码仅仅实现了两个事件
void EditDialog::mousePressEvent(QMouseEvent *event){ if (event->button() == Qt::LeftButton) { m_DragPosition = event->globalPos() - this->pos(); event->accept(); }}void EditDialog::mouseMoveEvent(QMouseEvent *event){ if (event->buttons() && Qt::LeftButton) { move(event->globalPos() - m_DragPosition); event->accept(); }}
但是这样就会有一个问题,就是当鼠标在一个实现了mousePressEvent的类上点击时(比如QPushButton)会被该类优先处理此事件
而不会将事件传递到窗体的mousePressEvent中。继续,当移动鼠标到这个按钮外时(假设点在了QPushButton上)会触发窗体的mouseMoveEvent
从而导致计算坐标时发生错误,此时你就会看到窗体闪了一下,变动了位置,鼠标也没有停在前面按下的按钮之上。
解决办法也很简单,就是再多声明一个bool变量来判断,并实现mouseReleaseEvent即可
void EditDialog::mousePressEvent(QMouseEvent *event){ if (event->button() == Qt::LeftButton) { m_Drag = true; m_DragPosition = event->globalPos() - this->pos(); event->accept(); }}void EditDialog::mouseMoveEvent(QMouseEvent *event){ if (m_Drag && (event->buttons() && Qt::LeftButton)) { move(event->globalPos() - m_DragPosition); event->accept(); }}void EditDialog::mouseReleaseEvent(QMouseEvent *){ m_Drag = false;}
这样,就完成了无边框窗体的拖动。可是,这样做的效率并不高,因为鼠标每次move时都会触发事件,计算位置,移动窗口,重绘窗口……
当窗体上有QWebView部件时,特别是网页中有图片,Flash时,你就会发现用上面的方案去移动窗体时会非常不流畅。
如果不考虑跨平台,只针对Windows平台,那么我建议用Windows下的标准方法,模拟标题栏移动消息,既简单又高效
void MainWindow::mousePressEvent(QMouseEvent *event){ if (ReleaseCapture()) SendMessage(HWND(this->winId()), WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0); event->ignore();}
这样,在拖动窗体时只会在松开鼠标时才将窗体移动过去,这样就避免了第一种方法的低效率问题
- Qt:移动无边框窗体
- Qt - 移动无边框窗体
- Qt移动无边框窗体
- Qt:移动无边框窗体
- qt 移动无边框的窗体
- Qt—移动无边框窗体
- Qt实现无边框窗体的移动
- Qt学习二:移动无边框窗体
- Qt无边框窗体移动和缩放
- 无边框窗体移动
- Qt 无边框、透明、可移动的个性窗体
- Qt 无边框、透明、可移动的个性窗体
- QT实现无边框的可移动窗体
- Qt 无边框、透明、可移动、的个性窗体
- QT无边框可移动可改变大小窗体
- Qt:通过鼠标拖拽,来移动无边框窗体
- Qt学习笔记:无边框窗体的移动
- C# 无边框窗体移动
- 关于移动gpu 炮神文
- [Qt4]程序启动界面设置 + 资源机制
- poj 3728 The merchant
- 进程与线程的一个简单解释
- hdu 2393
- Qt:移动无边框窗体
- 使apache解析域名到目录的方法
- Spring 系列: Spring 框架简介
- 11850 - Alaska
- POJ 2777 Count Color(线段染色 区间更新)
- 伸展树--Java实现
- 这些初创公司为何要拒绝上亿美元的投资
- C语言中隐式数据类型转换的总结
- java 实现将String字符串大写中文数字转换成int类型整数