#include "sui.h" sui::sui(QWidget *parent) : QWidget(parent), m_layout(new QVBoxLayout), m_widget(new QWidget), m_press(false), m_border_width(2), ori(NONE) { m_title = new sui_title(this); setObjectName(tr("m_widget")); m_layout->addWidget(m_title); m_title->setMouseTracking(true); m_layout->setContentsMargins(5, 5, 5, 5); m_layout->setSpacing(0); setWindowFlags(Qt::FramelessWindowHint); setAttribute(Qt::WA_TranslucentBackground); setMouseTracking(true); setBaseSize(1260, 800); resize(1260, 800); setLayout(m_layout); connect(m_title, SIGNAL(signals_close()), this, SLOT(close())); } sui::~sui() { } void sui::showEvent(QShowEvent *event) { this->setAttribute(Qt::WA_Mapped); QWidget::showEvent(event); QSize oldSize = this->size(); resize(oldSize + QSize(10, 10)); resize(oldSize); } void sui::paintEvent(QPaintEvent *event) { QStyleOption opt; opt.initFrom(this); QPainter painter(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this); painter.setRenderHint(QPainter::Antialiasing); painter.drawRoundedRect(this->rect(), 10, 10); QWidget::paintEvent(event); } void sui::region(const QPoint ¤tGlobalPoint) { // 获取窗体在屏幕上的位置区域,topLeft为坐上角点,rightButton为右下角点 QRect rect = this->rect(); // 将左上角的(0,0)转化为全局坐标 QPoint topLeft = this->mapToGlobal(rect.topLeft()); QPoint rightButton = this->mapToGlobal(rect.bottomRight()); // 当前鼠标的坐标 int x = currentGlobalPoint.x(); int y = currentGlobalPoint.y(); if (((topLeft.x() + m_border_width >= x) && (topLeft.x() <= x)) && ((topLeft.y() + m_border_width >= y) && (topLeft.y() <= y))) { // 左上角 ori = LEFTTOP; // 设置光标形状 this->setCursor(QCursor(Qt::SizeFDiagCursor)); } else if (((x >= rightButton.x() - m_border_width) && (x <= rightButton.x())) && ((y >= rightButton.y() - m_border_width) && (y <= rightButton.y()))) { // 右下角 ori = RIGHTBOTTOM; this->setCursor(QCursor(Qt::SizeFDiagCursor)); } else if (((x <= topLeft.x() + m_border_width) && (x >= topLeft.x())) && ((y >= rightButton.y() - m_border_width) && (y <= rightButton.y()))) { // 左下角 ori = LEFTBOTTOM; this->setCursor(QCursor(Qt::SizeBDiagCursor)); } else if (((x <= rightButton.x()) && (x >= rightButton.x() - m_border_width)) && ((y >= topLeft.y()) && (y <= topLeft.y() + m_border_width))) { // 右上角 ori = RIGHTTOP; this->setCursor(QCursor(Qt::SizeBDiagCursor)); } else if ((x <= topLeft.x() + m_border_width) && (x >= topLeft.x())) { // 左边 ori = LEFT; this->setCursor(QCursor(Qt::SizeHorCursor)); } else if ((x <= rightButton.x()) && (x >= rightButton.x() - m_border_width)) { // 右边 ori = RIGHT; this->setCursor(QCursor(Qt::SizeHorCursor)); } else if ((y >= topLeft.y()) && (y <= topLeft.y() + m_border_width)) { // 上边 ori = UP; this->setCursor(QCursor(Qt::SizeVerCursor)); } else if ((y <= rightButton.y()) && (y >= rightButton.y() - m_border_width)) { // 下边 ori = DOWN; this->setCursor(QCursor(Qt::SizeVerCursor)); } else { // 默认 ori = NONE; this->setCursor(QCursor(Qt::ArrowCursor)); } } void sui::mousePressEvent(QMouseEvent *event) { switch (event->button()) { case Qt::LeftButton: m_press = true; if (ori != NONE) { // 返回当前抓取鼠标输入的窗口 this->mouseGrabber(); } else { m_point = event->globalPosition().toPoint() - this->frameGeometry().topLeft(); // globalPos()鼠标位置,topLeft()窗口左上角的位置 } break; case Qt::RightButton: //this->setWindowState(Qt::WindowMinimized); break; default: QWidget::mousePressEvent(event); } } void sui::mouseMoveEvent(QMouseEvent *event) { QPoint globalPoint = event->globalPosition().toPoint(); QRect rect = this->rect(); QPoint topLeft = mapToGlobal(rect.topLeft()); QPoint bottomRight = mapToGlobal(rect.bottomRight()); if (this->windowState() != Qt::WindowMaximized) { // 没有按下左键时 if (!m_press) { // 窗口大小的改变——判断鼠标位置,改变光标形状 this->region(globalPoint); } else { if (ori != NONE) { QRect newRect(topLeft, bottomRight); switch (ori) { case LEFT: if (bottomRight.x() - globalPoint.x() <= this->minimumWidth()) { // 小于界面的最小宽度时,设置为左上角横坐标为窗口x newRect.setLeft(topLeft.x()); // 只改变左边界 } else { newRect.setLeft(globalPoint.x()); } break; case RIGHT: // 只能改变右边界 newRect.setWidth(globalPoint.x() - topLeft.x()); break; case UP: if (bottomRight.y() - globalPoint.y() <= this->minimumHeight()) { newRect.setY(topLeft.y()); } else { newRect.setY(globalPoint.y()); } break; case DOWN: newRect.setHeight(globalPoint.y() - topLeft.y()); break; case LEFTTOP: if (bottomRight.x() - globalPoint.x() <= this->minimumWidth()) { newRect.setX(topLeft.x()); } else { newRect.setX(globalPoint.x()); } if (bottomRight.y() - globalPoint.y() <= this->minimumHeight()) { newRect.setY(topLeft.y()); } else { newRect.setY(globalPoint.y()); } break; case RIGHTTOP: if (globalPoint.x() - topLeft.x() >= this->minimumWidth()) { newRect.setWidth(globalPoint.x() - topLeft.x()); } else { newRect.setWidth(bottomRight.x() - topLeft.x()); } if (bottomRight.y() - globalPoint.y() >= this->minimumHeight()) { newRect.setY(globalPoint.y()); } else { newRect.setY(topLeft.y()); } break; case LEFTBOTTOM: if (bottomRight.x() - globalPoint.x() >= this->minimumWidth()) { newRect.setX(globalPoint.x()); } else { newRect.setX(topLeft.x()); } if (globalPoint.y() - topLeft.y() >= this->minimumHeight()) { newRect.setHeight(globalPoint.y() - topLeft.y()); } else { newRect.setHeight(bottomRight.y() - topLeft.y()); } break; case RIGHTBOTTOM: newRect.setWidth(globalPoint.x() - topLeft.x()); newRect.setHeight(globalPoint.y() - topLeft.y()); break; default: break; } this->setGeometry(newRect); } else { // 移动窗口 move(event->globalPosition().toPoint() - m_point); event->accept(); } } } } // 鼠标释放事件 void sui::mouseReleaseEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { m_press = false; if (ori != NONE) { // 释放鼠标抓取 this->releaseMouse(); this->setCursor(QCursor(Qt::ArrowCursor)); ori = NONE; } } }