您当前的位置: 首页 >  qt

鱼儿-1226

暂无认证

  • 0浏览

    0关注

    1100博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

QT 窗口拖拽移动实现(抖动)

鱼儿-1226 发布时间:2020-08-20 15:02:37 ,浏览量:0

我们知道,要实现窗口移动可以直接鼠标点住窗口的标题栏实现拖拽移动,这是窗口默认的行为,在QT中的事件响应函数为moveEvent。

但是现实中经常需要鼠标点住窗口客户区域实现窗口的拖拽移动,代码实现如下:

Widget.h

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

 

#ifndef WIDGET_H #define WIDGET_H #include  class QMouseEvent; class Widget : public QWidget {     Q_OBJECT public:     Widget(QWidget *parent = 0);     ~Widget(); protected:     //拖拽窗口     void mousePressEvent(QMouseEvent *event);     void mouseMoveEvent(QMouseEvent *event);     void mouseReleaseEvent(QMouseEvent *event); private:     bool        m_bDrag;     QPoint      mouseStartPoint;     QPoint      windowTopLeftPoint; }; #endif // WIDGET_H

Widget.cpp

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

 

#include "Widget.h" #include  Widget::Widget(QWidget *parent)     : QWidget(parent)     , m_bDrag(false) {     setWindowTitle("窗口拖拽移动");

    setFixedSize(640, 480); } Widget::~Widget() { } /* QPoint QMouseEvent::pos() const     Returns the position of the mouse cursor, relative to the widget that received the event.     If you move the widget as a result of the mouse event, use the global position returned by globalPos() to avoid a shaking motion.  */ //拖拽操作 void Widget::mousePressEvent(QMouseEvent *event) {     if(event->button() == Qt::LeftButton)     {         m_bDrag = true;         //获得鼠标的初始位置         mouseStartPoint = event->globalPos();         //mouseStartPoint = event->pos();         //获得窗口的初始位置         windowTopLeftPoint = this->frameGeometry().topLeft();     } } void Widget::mouseMoveEvent(QMouseEvent *event) {     if(m_bDrag)     {         //获得鼠标移动的距离         QPoint distance = event->globalPos() - mouseStartPoint;         //QPoint distance = event->pos() - mouseStartPoint;         //改变窗口的位置         this->move(windowTopLeftPoint + distance);     } } void Widget::mouseReleaseEvent(QMouseEvent *event) {     if(event->button() == Qt::LeftButton)     {         m_bDrag = false;     } }

需要注意的一点:一般定位鼠标坐标使用的是event->pos()和event->globalPos()两个函数,

event->globalPos()获取的鼠标位置是鼠标偏离电脑屏幕左上角(x=0,y=0)的位置;

event->pos()获取的位置是主窗口(widget窗口)左上角(边框的左上角,外左上角)相对于电脑屏幕的左上角的(x=0,y=0)偏移位置

一般不采用前者,使用前者,拖动准确性较低且会产生抖动。

希望大家能把自己的所学和他人一起分享,不要去鄙视别人索取时的贪婪,因为最应该被鄙视的是不肯分享时的吝啬。

关注
打赏
1604459285
查看更多评论
立即登录/注册

微信扫码登录

0.0418s