在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;
}
实现效果