diff --git a/framelesswidget/framelesswidget.cpp b/framelesswidget/framelesswidget.cpp index c1df793..e7b613d 100644 --- a/framelesswidget/framelesswidget.cpp +++ b/framelesswidget/framelesswidget.cpp @@ -34,146 +34,147 @@ bool FramelessWidget::eventFilter(QObject *watched, QEvent *event) int height = widget->height(); //左侧描点区域 - rectLeft = QRectF(0, padding, padding, height - padding * 2); + rectLeft = QRect(0, padding, padding, height - padding * 2); //上侧描点区域 - rectTop = QRectF(padding, 0, width - padding * 2, padding); + rectTop = QRect(padding, 0, width - padding * 2, padding); //右侧描点区域 - rectRight = QRectF(width - padding, padding, padding, height - padding * 2); + rectRight = QRect(width - padding, padding, padding, height - padding * 2); //下侧描点区域 - rectBottom = QRectF(padding, height - padding, width - padding * 2, padding); + rectBottom = QRect(padding, height - padding, width - padding * 2, padding); //左上角描点区域 - rectLeftTop = QRectF(0, 0, padding, padding); + rectLeftTop = QRect(0, 0, padding, padding); //右上角描点区域 - rectRightTop = QRectF(width - padding, 0, padding, padding); + rectRightTop = QRect(width - padding, 0, padding, padding); //左下角描点区域 - rectLeftBottom = QRectF(0, height - padding, padding, padding); + rectLeftBottom = QRect(0, height - padding, padding, padding); //右下角描点区域 - rectRightBottom = QRectF(width - padding, height - padding, padding, padding); - } else { - QMouseEvent *mouseEvent = (QMouseEvent *)event; - if (event->type() == QEvent::MouseButtonPress) { - //记住当前控件坐标和宽高以及鼠标按下的坐标 - rectX = widget->x(); - rectY = widget->y(); - rectW = widget->width(); - rectH = widget->height(); - lastPos = mouseEvent->pos(); - - //判断按下的手柄的区域位置 - if (rectLeft.contains(lastPos)) { - pressedLeft = true; - } else if (rectRight.contains(lastPos)) { - pressedRight = true; - } else if (rectTop.contains(lastPos)) { - pressedTop = true; - } else if (rectBottom.contains(lastPos)) { - pressedBottom = true; - } else if (rectLeftTop.contains(lastPos)) { - pressedLeftTop = true; - } else if (rectRightTop.contains(lastPos)) { - pressedRightTop = true; - } else if (rectLeftBottom.contains(lastPos)) { - pressedLeftBottom = true; - } else if (rectRightBottom.contains(lastPos)) { - pressedRightBottom = true; + rectRightBottom = QRect(width - padding, height - padding, padding, padding); + } else if (event->type() == QEvent::HoverMove) { + //设置对应鼠标形状,这个必须放在这里而不是下面,因为可以在鼠标没有按下的时候识别 + QHoverEvent *hoverEvent = (QHoverEvent *)event; + QPoint point = hoverEvent->pos(); + if (resizeEnable) { + if (rectLeft.contains(point)) { + widget->setCursor(Qt::SizeHorCursor); + } else if (rectRight.contains(point)) { + widget->setCursor(Qt::SizeHorCursor); + } else if (rectTop.contains(point)) { + widget->setCursor(Qt::SizeVerCursor); + } else if (rectBottom.contains(point)) { + widget->setCursor(Qt::SizeVerCursor); + } else if (rectLeftTop.contains(point)) { + widget->setCursor(Qt::SizeFDiagCursor); + } else if (rectRightTop.contains(point)) { + widget->setCursor(Qt::SizeBDiagCursor); + } else if (rectLeftBottom.contains(point)) { + widget->setCursor(Qt::SizeBDiagCursor); + } else if (rectRightBottom.contains(point)) { + widget->setCursor(Qt::SizeFDiagCursor); } else { - pressed = true; + widget->setCursor(Qt::ArrowCursor); } - } else if (event->type() == QEvent::MouseMove) { - //设置对应鼠标形状,这个必须放在这里而不是下面,因为可以在鼠标没有按下的时候识别 - QPoint point = mouseEvent->pos(); - if (resizeEnable) { - if (rectLeft.contains(point)) { - widget->setCursor(Qt::SizeHorCursor); - } else if (rectRight.contains(point)) { - widget->setCursor(Qt::SizeHorCursor); - } else if (rectTop.contains(point)) { - widget->setCursor(Qt::SizeVerCursor); - } else if (rectBottom.contains(point)) { - widget->setCursor(Qt::SizeVerCursor); - } else if (rectLeftTop.contains(point)) { - widget->setCursor(Qt::SizeFDiagCursor); - } else if (rectRightTop.contains(point)) { - widget->setCursor(Qt::SizeBDiagCursor); - } else if (rectLeftBottom.contains(point)) { - widget->setCursor(Qt::SizeBDiagCursor); - } else if (rectRightBottom.contains(point)) { - widget->setCursor(Qt::SizeFDiagCursor); - } else { - widget->setCursor(Qt::ArrowCursor); + } + + //根据当前鼠标位置,计算XY轴移动了多少 + int offsetX = point.x() - lastPos.x(); + int offsetY = point.y() - lastPos.y(); + + //根据按下处的位置判断是否是移动控件还是拉伸控件 + if (moveEnable) { + if (pressed) { + widget->move(widget->x() + offsetX, widget->y() + offsetY); + } + } + + if (resizeEnable) { + if (pressedLeft) { + int resizeW = widget->width() - offsetX; + if (widget->minimumWidth() <= resizeW) { + widget->setGeometry(widget->x() + offsetX, rectY, resizeW, rectH); } - } - - //根据当前鼠标位置,计算XY轴移动了多少 - int offsetX = point.x() - lastPos.x(); - int offsetY = point.y() - lastPos.y(); - - //根据按下处的位置判断是否是移动控件还是拉伸控件 - if (moveEnable) { - if (pressed) { - widget->move(widget->x() + offsetX, widget->y() + offsetY); + } else if (pressedRight) { + widget->setGeometry(rectX, rectY, rectW + offsetX, rectH); + } else if (pressedTop) { + int resizeH = widget->height() - offsetY; + if (widget->minimumHeight() <= resizeH) { + widget->setGeometry(rectX, widget->y() + offsetY, rectW, resizeH); } - } - - if (resizeEnable) { - if (pressedLeft) { - int resizeW = widget->width() - offsetX; - if (widget->minimumWidth() <= resizeW) { - widget->setGeometry(widget->x() + offsetX, rectY, resizeW, rectH); - } - } else if (pressedRight) { - widget->setGeometry(rectX, rectY, rectW + offsetX, rectH); - } else if (pressedTop) { - int resizeH = widget->height() - offsetY; - if (widget->minimumHeight() <= resizeH) { - widget->setGeometry(rectX, widget->y() + offsetY, rectW, resizeH); - } - } else if (pressedBottom) { - widget->setGeometry(rectX, rectY, rectW, rectH + offsetY); - } else if (pressedLeftTop) { - int resizeW = widget->width() - offsetX; - int resizeH = widget->height() - offsetY; - if (widget->minimumWidth() <= resizeW) { - widget->setGeometry(widget->x() + offsetX, widget->y(), resizeW, resizeH); - } - if (widget->minimumHeight() <= resizeH) { - widget->setGeometry(widget->x(), widget->y() + offsetY, resizeW, resizeH); - } - } else if (pressedRightTop) { - int resizeW = rectW + offsetX; - int resizeH = widget->height() - offsetY; - if (widget->minimumHeight() <= resizeH) { - widget->setGeometry(widget->x(), widget->y() + offsetY, resizeW, resizeH); - } - } else if (pressedLeftBottom) { - int resizeW = widget->width() - offsetX; - int resizeH = rectH + offsetY; - if (widget->minimumWidth() <= resizeW) { - widget->setGeometry(widget->x() + offsetX, widget->y(), resizeW, resizeH); - } - if (widget->minimumHeight() <= resizeH) { - widget->setGeometry(widget->x(), widget->y(), resizeW, resizeH); - } - } else if (pressedRightBottom) { - int resizeW = rectW + offsetX; - int resizeH = rectH + offsetY; + } else if (pressedBottom) { + widget->setGeometry(rectX, rectY, rectW, rectH + offsetY); + } else if (pressedLeftTop) { + int resizeW = widget->width() - offsetX; + int resizeH = widget->height() - offsetY; + if (widget->minimumWidth() <= resizeW) { + widget->setGeometry(widget->x() + offsetX, widget->y(), resizeW, resizeH); + } + if (widget->minimumHeight() <= resizeH) { + widget->setGeometry(widget->x(), widget->y() + offsetY, resizeW, resizeH); + } + } else if (pressedRightTop) { + int resizeW = rectW + offsetX; + int resizeH = widget->height() - offsetY; + if (widget->minimumHeight() <= resizeH) { + widget->setGeometry(widget->x(), widget->y() + offsetY, resizeW, resizeH); + } + } else if (pressedLeftBottom) { + int resizeW = widget->width() - offsetX; + int resizeH = rectH + offsetY; + if (widget->minimumWidth() <= resizeW) { + widget->setGeometry(widget->x() + offsetX, widget->y(), resizeW, resizeH); + } + if (widget->minimumHeight() <= resizeH) { widget->setGeometry(widget->x(), widget->y(), resizeW, resizeH); } + } else if (pressedRightBottom) { + int resizeW = rectW + offsetX; + int resizeH = rectH + offsetY; + widget->setGeometry(widget->x(), widget->y(), resizeW, resizeH); } - } else if (event->type() == QEvent::MouseButtonRelease) { - //恢复所有 - pressed = false; - pressedLeft = false; - pressedRight = false; - pressedTop = false; - pressedBottom = false; - pressedLeftTop = false; - pressedRightTop = false; - pressedLeftBottom = false; - pressedRightBottom = false; - widget->setCursor(Qt::ArrowCursor); } + } else if (event->type() == QEvent::MouseButtonPress) { + //记住当前控件坐标和宽高以及鼠标按下的坐标 + QMouseEvent *mouseEvent = (QMouseEvent *)event; + rectX = widget->x(); + rectY = widget->y(); + rectW = widget->width(); + rectH = widget->height(); + lastPos = mouseEvent->pos(); + + //判断按下的手柄的区域位置 + if (rectLeft.contains(lastPos)) { + pressedLeft = true; + } else if (rectRight.contains(lastPos)) { + pressedRight = true; + } else if (rectTop.contains(lastPos)) { + pressedTop = true; + } else if (rectBottom.contains(lastPos)) { + pressedBottom = true; + } else if (rectLeftTop.contains(lastPos)) { + pressedLeftTop = true; + } else if (rectRightTop.contains(lastPos)) { + pressedRightTop = true; + } else if (rectLeftBottom.contains(lastPos)) { + pressedLeftBottom = true; + } else if (rectRightBottom.contains(lastPos)) { + pressedRightBottom = true; + } else { + pressed = true; + } + } else if (event->type() == QEvent::MouseMove) { + //改成用HoverMove识别 + } else if (event->type() == QEvent::MouseButtonRelease) { + //恢复所有 + pressed = false; + pressedLeft = false; + pressedRight = false; + pressedTop = false; + pressedBottom = false; + pressedLeftTop = false; + pressedRightTop = false; + pressedLeftBottom = false; + pressedRightBottom = false; + widget->setCursor(Qt::ArrowCursor); } } @@ -203,8 +204,7 @@ void FramelessWidget::setWidget(QWidget *widget) this->widget->setMouseTracking(true); //绑定事件过滤器 this->widget->installEventFilter(this); - //设置无边框属性 - this->widget->setWindowFlags(widget->windowFlags() | Qt::FramelessWindowHint); - //this->widget->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint); + //设置悬停为真,必须设置这个,不然当父窗体里边还有子窗体全部遮挡了识别不到MouseMove,需要识别HoverMove + this->widget->setAttribute(Qt::WA_Hover, true); } } diff --git a/framelesswidget/framelesswidget.h b/framelesswidget/framelesswidget.h index 3f0753f..bdc59ee 100644 --- a/framelesswidget/framelesswidget.h +++ b/framelesswidget/framelesswidget.h @@ -51,14 +51,14 @@ private: int rectX, rectY, rectW, rectH; //窗体坐标+宽高 QPoint lastPos; //鼠标按下处坐标 - QRectF rectLeft; //左侧区域 - QRectF rectRight; //右侧区域 - QRectF rectTop; //上侧区域 - QRectF rectBottom; //下侧区域 - QRectF rectLeftTop; //左上侧区域 - QRectF rectRightTop; //右上侧区域 - QRectF rectLeftBottom; //左下侧区域 - QRectF rectRightBottom; //右下侧区域 + QRect rectLeft; //左侧区域 + QRect rectRight; //右侧区域 + QRect rectTop; //上侧区域 + QRect rectBottom; //下侧区域 + QRect rectLeftTop; //左上侧区域 + QRect rectRightTop; //右上侧区域 + QRect rectLeftBottom; //左下侧区域 + QRect rectRightBottom; //右下侧区域 public Q_SLOTS: //设置边距 diff --git a/framelesswidget/frmframelesswidget.cpp b/framelesswidget/frmframelesswidget.cpp index 72494f8..944e9cb 100644 --- a/framelesswidget/frmframelesswidget.cpp +++ b/framelesswidget/frmframelesswidget.cpp @@ -9,6 +9,7 @@ frmFramelessWidget::frmFramelessWidget(QWidget *parent) : QWidget(parent), ui(new Ui::frmFramelessWidget) { ui->setupUi(this); + w = 0; } frmFramelessWidget::~frmFramelessWidget() @@ -23,37 +24,41 @@ void frmFramelessWidget::closeEvent(QCloseEvent *) void frmFramelessWidget::on_btnOpen_clicked() { - QWidget *w = new QWidget; - w->setAttribute(Qt::WA_DeleteOnClose); - w->setWindowFlags(Qt::WindowStaysOnTopHint); - w->setWindowTitle("自由拉伸无边框窗体"); - w->setMinimumSize(200, 120); - w->resize(480, 320); + if (w == 0) { + w = new QWidget; + //设置无边框属性 + w->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint); + //w->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint); + w->setWindowTitle("自由拉伸无边框窗体"); + w->setMinimumSize(200, 120); + w->resize(480, 320); - //设置下背景颜色区别看 - QPalette palette = w->palette(); - palette.setBrush(QPalette::Background, QColor(162, 121, 197)); - w->setPalette(palette); + //设置下背景颜色区别看 + QPalette palette = w->palette(); + palette.setBrush(QPalette::Background, QColor(162, 121, 197)); + w->setPalette(palette); - QPushButton *btn = new QPushButton(w); - btn->setText("关闭"); - btn->setGeometry(10, 10, 130, 25); - connect(btn, SIGNAL(clicked(bool)), w, SLOT(close())); + QPushButton *btn = new QPushButton(w); + btn->setText("关闭"); + btn->setGeometry(10, 10, 130, 25); + connect(btn, SIGNAL(clicked(bool)), w, SLOT(close())); - QCheckBox *cboxMove = new QCheckBox(w); - cboxMove->setText("可移动"); - cboxMove->setChecked(true); - cboxMove->setGeometry(10, 40, 70, 25); - connect(cboxMove, SIGNAL(stateChanged(int)), this, SLOT(stateChanged1(int))); + QCheckBox *cboxMove = new QCheckBox(w); + cboxMove->setText("可移动"); + cboxMove->setChecked(true); + cboxMove->setGeometry(10, 40, 70, 25); + connect(cboxMove, SIGNAL(stateChanged(int)), this, SLOT(stateChanged1(int))); - QCheckBox *cboxResize = new QCheckBox(w); - cboxResize->setText("可拉伸"); - cboxResize->setChecked(true); - cboxResize->setGeometry(80, 40, 70, 25); - connect(cboxResize, SIGNAL(stateChanged(int)), this, SLOT(stateChanged2(int))); + QCheckBox *cboxResize = new QCheckBox(w); + cboxResize->setText("可拉伸"); + cboxResize->setChecked(true); + cboxResize->setGeometry(80, 40, 70, 25); + connect(cboxResize, SIGNAL(stateChanged(int)), this, SLOT(stateChanged2(int))); + + frameless = new FramelessWidget(w); + frameless->setWidget(w); + } - frameless = new FramelessWidget(w); - frameless->setWidget(w); w->show(); } diff --git a/framelesswidget/frmframelesswidget.h b/framelesswidget/frmframelesswidget.h index 4907876..487ccb7 100644 --- a/framelesswidget/frmframelesswidget.h +++ b/framelesswidget/frmframelesswidget.h @@ -22,6 +22,7 @@ protected: private: Ui::frmFramelessWidget *ui; + QWidget *w; FramelessWidget *frameless; private slots: