zoukankan      html  css  js  c++  java
  • Qt开源作品8-通用控件移动

    一、前言

    在做一些项目的过程中,有一种应用场景是需要拖动设备在一个容器中,自由拖动摆放到合适的位置,然后保存对应设备的坐标位置信息,在软件启动好以后自动加载配置好的坐标位置信息,将每个设备移动到对应的位置,最好背景图在来个3D鸟瞰图,或者来点三维实景,搞得很炫。这就是这个控件的来由,还有一种场景比如组态软件,自由拖动设计自定义控件和图片等,也需要在容器中拖来拖去的,如果有一个通用的控件移动类,直接new出来传入需要移动的widget,这样就方便多了,不需要每个控件或者窗体自身去实现这种通用的重复的功能。

    二、代码思路

    #include "movewidget.h"
    #include "qevent.h"
    #include "qdebug.h"
    
    MoveWidget::MoveWidget(QObject *parent) : QObject(parent)
    {
        lastPoint = QPoint(0, 0);
        pressed = false;
        leftButton = true;
        inControl = true;
        widget = 0;
    }
    
    bool MoveWidget::eventFilter(QObject *watched, QEvent *event)
    {
        if (widget != 0 && watched == widget) {
            QMouseEvent *mouseEvent = (QMouseEvent *)event;
            if (mouseEvent->type() == QEvent::MouseButtonPress) {
                //如果限定了只能鼠标左键拖动则判断当前是否是鼠标左键
                if (leftButton && mouseEvent->button() != Qt::LeftButton) {
                    return false;
                }
    
                //判断控件的区域是否包含了当前鼠标的坐标
                if (widget->rect().contains(mouseEvent->pos())) {
                    lastPoint = mouseEvent->pos();
                    pressed = true;
                }
            } else if (mouseEvent->type() == QEvent::MouseMove && pressed) {
                //计算坐标偏移值,调用move函数移动过去
                int offsetX = mouseEvent->pos().x() - lastPoint.x();
                int offsetY = mouseEvent->pos().y() - lastPoint.y();
                int x = widget->x() + offsetX;
                int y = widget->y() + offsetY;
                if (inControl) {
                    //可以自行调整限定在容器中的范围,这里默认保留20个像素在里面
                    int offset = 20;
                    bool xyOut = (x + widget->width() < offset || y + widget->height() < offset);
                    bool whOut = false;
                    QWidget *w = (QWidget *)widget->parent();
                    if (w != 0) {
                        whOut = (w->width() - x < offset || w->height() - y < offset);
                    }
                    if (xyOut || whOut) {
                        return false;
                    }
                }
    
                widget->move(x, y);
            } else if (mouseEvent->type() == QEvent::MouseButtonRelease && pressed) {
                pressed = false;
            }
        }
    
        return QObject::eventFilter(watched, event);
    }
    
    void MoveWidget::setLeftButton(bool leftButton)
    {
        this->leftButton = leftButton;
    }
    
    void MoveWidget::setInControl(bool inControl)
    {
        this->inControl = inControl;
    }
    
    void MoveWidget::setWidget(QWidget *widget)
    {
        if (this->widget == 0) {
            this->widget = widget;
            this->widget->installEventFilter(this);
        }
    }
    

    三、效果图

    四、开源主页

    以上作品完整源码下载都在开源主页,会持续不断更新作品数量和质量,欢迎各位关注。

    1. 国内站点:https://gitee.com/feiyangqingyun/QWidgetDemo
    2. 国际站点:https://github.com/feiyangqingyun/QWidgetDemo
    3. 个人主页:https://blog.csdn.net/feiyangqingyun
    4. 知乎主页:https://www.zhihu.com/people/feiyangqingyun/
  • 相关阅读:
    common-fileupload上传图片并显示图片
    common-fileupload上传文件
    Hibernate映射文件配置(hbm.xml和注解方式)
    hdu1272:小希的迷宫(并查集)
    hdu1272:小希的迷宫(并查集)
    hdu1102:Constructing Roads(最小生成树)
    hdu1102:Constructing Roads(最小生成树)
    hdu1054:Strategic Game(最小点覆盖)
    hdu1054:Strategic Game(最小点覆盖)
    hdu2255:奔小康赚大钱(KM)
  • 原文地址:https://www.cnblogs.com/feiyangqingyun/p/12880386.html
Copyright © 2011-2022 走看看