/*四角10个像素可以放大缩小,边框10像素可以移动*/
class myWidget : public QWidget { typedef enum { REPORT_SIDES_MARK_MIN = -1, REPORT_SDIES_MARK_LEFT_UP, REPORT_SDIES_MARK_LEFT_DOWN, REPORT_SDIES_MARK_RIGHT_UP, REPORT_SDIES_MARK_RIGHT_DOWN, REPORT_SDIES_MARK_MAX
}REPORT_SIDES_MARK_ENUM; Q_OBJECT public: myWidget(QWidget *parent = Q_NULLPTR); ~myWidget();
protected: void mouseMoveEvent(QMouseEvent *); void mousePressEvent(QMouseEvent *); void resizeEvent(QResizeEvent *);
private: REPORT_SIDES_MARK_ENUM m_sidesMark; bool m_mouseLeftClick; QTextEdit *m_text;
QPoint m_point; QPoint m_pos; };
/*具体实现*/
myWidget::myWidget(QWidget *parent) : QWidget(parent) , m_sidesMark(REPORT_SIDES_MARK_MIN) { this->setMouseTracking(true); this->setFocusPolicy(Qt::StrongFocus); this->setStyleSheet("background-color:rgb(0,0,0)"); this->setWindowFlags(Qt::FramelessWindowHint); this->resize(220, 220);
m_text = new QTextEdit(this); m_text->resize(200, 200); m_text->move(10, 10); m_text->setContentsMargins(10,10,10,10); }
myWidget::~myWidget() {
}
void myWidget::mouseMoveEvent(QMouseEvent *event) { if (0 < event->pos().x() && event->pos().x() < 10 && 0 < event->pos().y() && event->pos().y() < 10 || this->width() - 10 < event->pos().x() && event->pos().x() < this->width() && this->height() - 10 < event->pos().y() && event->pos().y() < this->height()) //左上角 { this->setCursor(Qt::SizeFDiagCursor); } else if(this->height() - 10 < event->pos().y() && event->pos().y() < this->height() && 0 < event->pos().x() && event->pos().x() < 10 || this->width() - 10 < event->pos().x() && event->pos().x() < this->width() && 0 < event->pos().y() && event->pos().y() < 10) //左下角 { this->setCursor(Qt::SizeBDiagCursor); } else if (10 < event->pos().x() && event->pos().x() < this->width() - 10 && 0 < event->pos().y() && event->pos().y() < 10 || 10 < event->pos().y() && event->pos().y() < this->height() - 10 && 0 < event->pos().x() && event->pos().x() < 10 || 10 < event->pos().y() && event->pos().y() < this->height() - 10 && this->width() - 10 < event->pos().x() && event->pos().x() < this->width() || 10 < event->pos().x() && event->pos().x() < this->width() - 10 && this->height() - 10 < event->pos().y() && event->pos().y() < this->height()) //上 { this->setCursor(Qt::SizeAllCursor); }
if (event->buttons() & Qt::LeftButton) { if (m_mouseLeftClick == false) { //移动中的鼠标位置相对于初始位置的相对位置. QPoint relativePos = event->globalPos() - m_point; //然后移动窗体即可. this->move(m_pos + relativePos); } else { if (m_sidesMark == REPORT_SDIES_MARK_LEFT_UP) /*顶*/ { QRect rect = this->geometry(); rect.setTop(this->mapToParent(event->pos()).y()); rect.setLeft(this->mapToParent(event->pos()).x()); this->setGeometry(rect); } else if (m_sidesMark == REPORT_SDIES_MARK_RIGHT_UP)/*右*/ { QRect rect = this->geometry(); rect.setRight(this->mapToParent(event->pos()).x()); rect.setTop(this->mapToParent(event->pos()).y()); this->setGeometry(rect);
} else if (m_sidesMark == REPORT_SDIES_MARK_LEFT_DOWN) /*左*/ { QRect rect = this->geometry(); rect.setLeft(this->mapToParent(event->pos()).x()); rect.setBottom(this->mapToParent(event->pos()).y()); this->setGeometry(rect); } else if (m_sidesMark == REPORT_SDIES_MARK_RIGHT_DOWN) /*底*/ { QRect rect = this->geometry(); rect.setBottom(this->mapToParent(event->pos()).y()); rect.setRight(this->mapToParent(event->pos()).x()); this->setGeometry(rect); } } } QWidget::mouseMoveEvent(event); }
void myWidget::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { if (0 < event->pos().x() && event->pos().x() < 10 && 0 < event->pos().y() && event->pos().y() < 10) { m_mouseLeftClick = true; m_sidesMark = REPORT_SDIES_MARK_LEFT_UP; } else if(this->width() - 10 < event->pos().x() && event->pos().x() < this->width() && this->height() - 10 < event->pos().y() && event->pos().y() < this->height()) //左上角 { m_mouseLeftClick = true; m_sidesMark = REPORT_SDIES_MARK_RIGHT_DOWN; } else if (this->height() - 10 < event->pos().y() && event->pos().y() < this->height() && 0 < event->pos().x() && event->pos().x() < 10) { m_mouseLeftClick = true; m_sidesMark = REPORT_SDIES_MARK_LEFT_DOWN; } else if(this->width() - 10 < event->pos().x() && event->pos().x() < this->width() && 0 < event->pos().y() && event->pos().y() < 10) //左下角 { m_mouseLeftClick = true; m_sidesMark = REPORT_SDIES_MARK_RIGHT_UP; } else if (10 < event->pos().x() && event->pos().x() < this->width() - 10 && 0 < event->pos().y() && event->pos().y() < 10 || 10 < event->pos().y() && event->pos().y() < this->height() - 10 && 0 < event->pos().x() && event->pos().x() < 10 || 10 < event->pos().y() && event->pos().y() < this->height() - 10 && this->width() - 10 < event->pos().x() && event->pos().x() < this->width() || 10 < event->pos().x() && event->pos().x() < this->width() - 10 && this->height() - 10 < event->pos().y() && event->pos().y() < this->height()) // { //记录鼠标的世界坐标. m_point = event->globalPos(); //记录窗体的世界坐标. m_pos = this->frameGeometry().topLeft(); m_mouseLeftClick = false; } }
QWidget::mousePressEvent(event); }
void myWidget::resizeEvent(QResizeEvent *event) { m_text->resize(this->width() - 20, this->height() - 20);
QWidget::resizeEvent(event); }