qt使用框选功能,类似windows选择多份文件

在windows中的选择是这样的
在这里插入图片描述
可以进行上下左右随意的移动。
在qt中想要实现这个功能,首先你需要对坐标系了解。
正常的坐标系是 右为正,上为正。
但是在qt的坐标系统中 右为正,下为正
这个理解后,那么就好办了
则在qt的坐标系中
第一象限为 负,负
第二象限为 正,负
第三象限为 负,正
第四象限为 正,正

当鼠标点击的第一个位置,则判定为中心点。然后在鼠标拖动的时候判断在第几象限内,使用2个变量来维护起始点和结束点。

看代码:
代价加入了一个shift才出发选中

#include "widget.h"
#include <QMouseEvent>
#include <QKeyEvent>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    m_pWgt=new QWidget(this);
    //m_pWgt->setWindowFlags(Qt::FramelessWindowHint);
    m_pWgt->setWindowOpacity(0.2);
    m_pWgt->setStyleSheet("border:1px solid blue;");
    m_pWgt->hide();
    this->setFocus();
}

Widget::~Widget()
{
}

void Widget::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton&& m_bShift)
    {
        if (m_bShift)
        {
            m_pWgt->setFixedSize(1, 1);

            m_BeginPoint =mapToGlobal(event->pos());
            //m_BeginPoint =event->pos();
            m_pWgt->move(m_BeginPoint-this->pos());
            m_pWgt->show();
        }
    }
}

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    if (event->buttons() == Qt::LeftButton)
    {
        if (m_bShift)
        {
            /*QPoint point1 = mapToGlobal(event->pos());
                m_ShiftPointEnd.setX(point1.x());
                m_ShiftPointEnd.setY(point1.y() - 60 + m_WheelValue);*/

            //QPoint movePoint= event->globalPos();

            //QPoint movePoint = mapToGlobal(event->pos());

            QPoint movePoint = mapToGlobal(event->pos());

            m_MoveVector.clear();

            if (movePoint.x() > m_BeginPoint.x()&& movePoint.y()> m_BeginPoint.y())  //第四象限
            {
                m_MoveVector.push_back(m_BeginPoint);
                m_MoveVector.push_back(movePoint);
            }
            else if (movePoint.x() < m_BeginPoint.x() && movePoint.y() < m_BeginPoint.y()) //第一象限
            {
                m_MoveVector.push_back(movePoint);
                m_MoveVector.push_back(m_BeginPoint);
            }
            else if (movePoint.x() > m_BeginPoint.x() && movePoint.y() < m_BeginPoint.y()) //第二象限
            {

                QPoint beginPoint, endPoint;
                beginPoint.setX(m_BeginPoint.x());
                beginPoint.setY(movePoint.y());

                endPoint.setX(movePoint.x());
                endPoint.setY(m_BeginPoint.y());

                m_MoveVector.push_back(beginPoint);
                m_MoveVector.push_back(endPoint);
            }
            else if (movePoint.x() < m_BeginPoint.x() && movePoint.y() > m_BeginPoint.y()) //第三象限
            {
                QPoint beginPoint, endPoint;
                beginPoint.setX(movePoint.x());
                beginPoint.setY(m_BeginPoint.y());
                endPoint.setX(m_BeginPoint.x());
                endPoint.setY(movePoint.y());
                m_MoveVector.push_back(beginPoint);
                m_MoveVector.push_back(endPoint);
            }
            if (m_MoveVector.size() >= 2)
            {
                m_pWgt->move(m_MoveVector[0]-this->pos());
                m_pWgt->setFixedSize(abs((m_MoveVector[1].x() - m_MoveVector[0].x())), abs((m_MoveVector[1].y() - m_MoveVector[0].y())));
            }
        }
    }
}

void Widget::mouseReleaseEvent(QMouseEvent *event)
{
    m_pWgt->hide();
}

void Widget::keyPressEvent(QKeyEvent *event)
{
    if (event->key() == Qt::Key_Shift)
    {
        m_bShift = true;
    }
}

void Widget::keyReleaseEvent(QKeyEvent *event)
{
    m_bShift = false;
}


实现效果
在这里插入图片描述

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加油小杜(接qt定制功能,单模块开发等)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值