C0003.用C++开发Qt界面,针对无边框界面,实现界面可任意拖动
具体实现代码如下:
namespace NaSpLink {
// 新建一个类,来重写拖动事件函数
class DragWidgetFilter : public QObject {
public:
DragWidgetFilter(QObject *parent)
: QObject(parent) {
}
// 重写事件过滤函数
bool eventFilter(QObject *object, QEvent *event) {
// 通过dynamic_cast将窗口转换成QWidget类
auto w = dynamic_cast<QWidget *>(object);
// 如果转换失败
if (!w) {
return false;
}
// 如果转换成功了,并且事件类型是鼠标按下的事件
if (event->type() == QEvent::MouseButtonPress) {
// 将事件转换成QMouseEvent类型
auto ev = dynamic_cast<QMouseEvent *>(event);
// 如果转换失败
if (!ev) {
return false;
}
// 否则,将鼠标点击的位置记录下来
pos = ev->pos();
}
// 如果事件类型是鼠标移动的事件
else if (event->type() == QEvent::MouseMove) {
// 将事件转换成QMouseEvent类型
auto ev = dynamic_cast<QMouseEvent *>(event);
// 如果转换失败
if (!ev)
return false;
// 如果移动事件的按钮,并且是左键
if (ev->buttons() & Qt::MouseButton::LeftButton) {
// 将窗口移动
w->move(ev->globalPos() - pos);
}
}
// 返回交由父类进行处理
return QObject::eventFilter(object, event);
}
private:
// 记录鼠标位置
QPoint pos;
};
}
如上就可以实现鼠标点击无边框界面的任意位置,即可拖动界面。
**注意:**这个代码有一个问题,就是鼠标点击无边框界面上的控件时,也是会拖动的,但是这个会造成冲突,从而导致界面会抖动。
解决办法还未找到,哪位大佬都帮忙一同解决一直。