效果
在四周调整
代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QWidget>
class MainWindow : public QWidget
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void paintEvent(QPaintEvent *event);
void updateRect();
void resizeEvent(QResizeEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
private:
bool isValid(QRect &rect);
bool isOutOfRange(QRect &rect);
void setSizeCursor(QMouseEvent *event);
private:
bool m_bPress{false};
bool m_bSetTop{false};
bool m_bSetLeft{false};
bool m_bSetRight{false};
bool m_bSetBottom{false};
bool m_bSetTopRight{false};
bool m_bSetBottomLeft{false};
bool m_bSetTopLeft{false};
bool m_bSetBottomRight{false};
bool m_bMinSize{true};
int m_minWidth{0};
int m_minHeight{0};
QRect m_rect;
QRect m_top;
QRect m_bottom;
QRect m_left;
QRect m_right;
QRect m_topLeft;
QRect m_topRight;
QRect m_bottomLeft;
QRect m_bottomRight;
QPoint m_pressPoint;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include <QPainter>
#include <QMouseEvent>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QWidget(parent)
{
this->setMouseTracking(true);
m_rect = QRect(90,80,100,100);
updateRect();
}
MainWindow::~MainWindow()
{
}
void MainWindow::paintEvent(QPaintEvent *)
{
QPainter painter{this};
QPen pen;
pen.setStyle(Qt::DashLine);
pen.setWidthF(0.5);
//pen.setColor(Qt::black);
pen.setColor(Qt::red);
painter.setPen(pen);
painter.drawRect(m_rect);
pen.setStyle(Qt::SolidLine);
pen.setWidthF(0.8);
painter.setPen(pen);
painter.setBrush(Qt::white);
painter.setRenderHints(QPainter::SmoothPixmapTransform|QPainter::Antialiasing|QPainter::HighQualityAntialiasing);
painter.drawEllipse(m_topLeft);
painter.drawEllipse(m_topRight);
painter.drawEllipse(m_bottomLeft);
painter.drawEllipse(m_bottomRight);
painter.drawEllipse(m_top);
painter.drawEllipse(m_bottom);
painter.drawEllipse(m_left);
painter.drawEllipse(m_right);
}
void MainWindow::updateRect()
{
int width = 3;
int offset = 4;
m_topLeft= QRect(m_rect.topLeft(),QSize(width,width));
m_topLeft = m_topLeft.adjusted(-offset,-offset,offset,offset);
m_topRight = QRect(m_rect.topRight(),QSize(width,width));
m_topRight = m_topRight.adjusted(-offset,-offset,offset,offset);
m_bottomLeft = QRect(m_rect.bottomLeft(),QSize(width,width));
m_bottomLeft = m_bottomLeft.adjusted(-offset,-offset,offset,offset);
m_bottomRight= QRect(m_rect.bottomRight(),QSize(width,width));
m_bottomRight = m_bottomRight.adjusted(-offset,-offset,offset,offset);
m_top = QRect((m_topLeft.x()+m_topRight.x())/2,m_topLeft.y(),m_topLeft.width(),m_topLeft.height() );
m_bottom = QRect((m_bottomLeft.x()+m_bottomRight.x())/2,m_bottomRight.y(),m_bottomRight.width(),m_bottomRight.height() );
m_left = QRect(m_topLeft.x(),(m_topLeft.y()+m_bottomLeft.y())/2,m_bottomLeft.width(),m_bottomLeft.height() );
m_right = QRect(m_topRight.x(),(m_topRight.y()+m_bottomRight.y())/2,m_topRight.width(),m_topRight.height() );
m_minWidth = m_topLeft.width()+m_top.width()+m_topRight.width();
m_minHeight = m_minWidth;
}
void MainWindow::resizeEvent(QResizeEvent *)
{
m_rect.moveCenter(this->rect().center());
updateRect();
}
void MainWindow::mousePressEvent(QMouseEvent *event)
{
if(!event){
return;
}
if(m_topLeft.contains(event->pos())){
m_bSetTopLeft=true;
}
else if(m_topRight.contains(event->pos())){
m_bSetTopRight=true;
}
else if(m_bottomLeft.contains(event->pos())){
m_bSetBottomLeft=true;
}
else if(m_bottomRight.contains(event->pos())){
m_bSetBottomRight=true;
}
else if(m_top.contains(event->pos())){
m_bSetTop=true;
}
else if(m_bottom.contains(event->pos())){
m_bSetBottom=true;
}
else if(m_left.contains(event->pos())){
m_bSetLeft=true;
}
else if(m_right.contains(event->pos())){
m_bSetRight=true;
}
else if(m_rect.contains(event->pos())){
m_bPress=true;
QPoint pressPoint = event->pos();
QPoint center = m_rect.center();
m_pressPoint = QPoint(pressPoint.x()-center.x(),pressPoint.y()-center.y());
}
}
void MainWindow::mouseReleaseEvent(QMouseEvent *)
{
m_bPress=false;
m_bSetTop = false;
m_bSetLeft = false;
m_bSetRight=false;
m_bSetBottom=false;
m_bSetTopRight=false;
m_bSetBottomLeft=false;
m_bSetTopLeft=false;
m_bSetBottomRight=false;
qDebug()<< __LINE__ << __FUNCTION__ << __FILE__<<m_rect;
}
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
if(!event){
return;
}
if(m_bSetTopRight){
QRect rect = m_rect;
rect.setTopRight(event->pos());
if(!this->isValid(rect)){
return;
}
if(rect.width()<0||rect.height()<0){
m_bSetBottomLeft=true;
m_bSetTopRight=false;
m_rect.setBottomLeft(event->pos());
}else{
m_rect=rect;
}
updateRect();
update();
}
else if(m_bSetBottomLeft){
QRect rect = m_rect;
rect.setBottomLeft(event->pos());
if(!this->isValid(rect)){
return;
}
if(rect.width()<0||rect.height()<0){
m_bSetBottomLeft=false;
m_bSetTopRight=true;
m_rect.setTopRight(event->pos());
}else{
m_rect=rect;
}
updateRect();
update();
}
else if(m_bSetTopLeft){
QRect rect = m_rect;
rect.setTopLeft(event->pos());
if(!this->isValid(rect)){
return;
}
if(rect.width()<0||rect.height()<0){
m_bSetTopLeft=false;
m_bSetBottomRight=true;
m_rect.setBottomRight(event->pos());
}else{
m_rect=rect;
}
updateRect();
update();
}
else if(m_bSetBottomRight){
QRect rect = m_rect;
rect.setBottomRight(event->pos());
if(!this->isValid(rect)){
return;
}
if(rect.width()<0||rect.height()<0){
m_bSetTopLeft=true;
m_bSetBottomRight=false;
m_rect.setTopLeft(event->pos());
}else{
m_rect=rect;
}
updateRect();
update();
}
else if(m_bSetTop){
QRect rect = m_rect;
rect.setTop(event->pos().y());
if(!this->isValid(rect)){
return;
}
if(rect.width()<0||rect.height()<0){
m_bSetBottom=true;
m_bSetTop=false;
m_rect.setBottom(event->pos().y());
}else{
m_rect=rect;
}
updateRect();
update();
}
else if(m_bSetBottom){
QRect rect = m_rect;
rect.setBottom(event->pos().y());
if(!this->isValid(rect)){
return;
}
if(rect.width()<0||rect.height()<0){
m_bSetBottom=false;
m_bSetTop=true;
m_rect.setTop(event->pos().y());
}else{
m_rect=rect;
}
updateRect();
update();
}
else if(m_bSetLeft){
QRect rect = m_rect;
rect.setLeft(event->pos().x());
if(!this->isValid(rect)){
return;
}
if(rect.width()<0||rect.height()<0){
m_bSetRight=true;
m_bSetLeft=false;
m_rect.setRight(event->pos().x());
}else{
m_rect=rect;
}
updateRect();
update();
}
else if(m_bSetRight){
QRect rect = m_rect;
rect.setRight(event->pos().x());
if(!this->isValid(rect)){
return;
}
if(rect.width()<0||rect.height()<0){
m_bSetRight=false;
m_bSetLeft=true;
m_rect.setLeft(event->pos().x());
}else{
m_rect=rect;
}
updateRect();
update();
}
else if(m_bPress){
QPoint point = event->pos();
point -= m_pressPoint;
QRect rect = m_rect;
rect.moveCenter(point);
if(this->isOutOfRange(rect)){
return;
}
m_rect=rect;
updateRect();
update();
}
else{
this->setSizeCursor(event);
}
}
bool MainWindow::isValid(QRect& rect)
{
if(m_bMinSize){
if(0 == m_minHeight || 0 == m_minWidth){
return true;
}
if(rect.width() < m_minWidth){
return false;
}
if(rect.height() < m_minHeight){
return false;
}
}
if(this->isOutOfRange(rect)){
return false;
}
return true;
}
bool MainWindow::isOutOfRange(QRect &rect)
{
if(rect.right() > this->rect().right()){
return true;
}
if(rect.bottom() > this->rect().bottom()){
return true;
}
if(rect.left() < 0){
return true;
}
if(rect.top() < 0){
return true;
}
return false;
}
void MainWindow::setSizeCursor(QMouseEvent *event)
{
if(m_topLeft.contains(event->pos())){
this->setCursor(QCursor(Qt::SizeFDiagCursor));
}
else if(m_topRight.contains(event->pos())){
this->setCursor(QCursor(Qt::SizeBDiagCursor));
}
else if(m_bottomLeft.contains(event->pos())){
this->setCursor(QCursor(Qt::SizeBDiagCursor));
}
else if(m_bottomRight.contains(event->pos())){
this->setCursor(QCursor(Qt::SizeFDiagCursor));
}
else if(m_top.contains(event->pos())){
this->setCursor(QCursor(Qt::SizeVerCursor));
}
else if(m_bottom.contains(event->pos())){
this->setCursor(QCursor(Qt::SizeVerCursor));
}
else if(m_left.contains(event->pos())){
this->setCursor(QCursor(Qt::SizeHorCursor));
}
else if(m_right.contains(event->pos())){
this->setCursor(QCursor(Qt::SizeHorCursor));
}
else if(m_rect.contains(event->pos())){
this->setCursor(QCursor(Qt::SizeAllCursor));
}
else{
this->setCursor(QCursor(Qt::ArrowCursor));
}
}