创建一个矩形,当鼠标进入这个矩形的时候,这个矩形边线变色,且鼠标变成手型

avatar
作者
猴君
阅读量:3

1.概要

创建一个矩形,当鼠标进入这个矩形的时候,这个矩形边线变色,且鼠标变成手型

2.代码

#include <QApplication> #include "customRectWidget.h" /*  * qt 6.7版, 创建一个矩形,当鼠标进入这个矩形的时候,这个矩形边线变色,  * 且鼠标变成手型,且这时候按下鼠标,鼠标可以上下拖动这个矩形,  * 当鼠标松开的时候停止移动,但鼠标离开矩形的时候,矩形颜色恢复,完整代码举例;  * 强调一下,鼠标进入矩形内,颜色变化,鼠标变成手型,不是鼠标进入矩形所在的控件就有上述变化。 */ int main(int argc, char *argv[]) {     QApplication app(argc, argv);     CustomRectWidget widget;     widget.show();     return app.exec(); } 
#ifndef CUSTOMRECTWIDGET_H #define CUSTOMRECTWIDGET_H  #include <QWidget> #include <QMouseEvent>  class CustomRectWidget : public QWidget {     Q_OBJECT  public:     explicit CustomRectWidget(QWidget *parent = nullptr);  protected:     void paintEvent(QPaintEvent *event) override;     void mouseMoveEvent(QMouseEvent *event) override;     void mousePressEvent(QMouseEvent *event) override;     void mouseReleaseEvent(QMouseEvent *event) override;     void enterEvent(QEnterEvent *event) override;     void leaveEvent(QEvent *event) override;     void setIsChange(const QPoint &mousePos); private:     QRect rect;     bool dragging;     QPoint dragStartPoint;     QColor hoverColor;     QColor normalColor;     bool isChange;      bool isMouseInsideRect(const QPoint &mousePos) const; };  #endif // CUSTOMRECTWIDGET_H 

 

#include "customRectWidget.h" #include <QPainter> #include <QCursor> #include <QDebug>  CustomRectWidget::CustomRectWidget(QWidget *parent)     : QWidget(parent), rect(50, 50, 200, 100), dragging(false), hoverColor(Qt::red), normalColor(Qt::black) {     setFixedSize(300, 300);     // 启用鼠标追踪,以便在鼠标没有按下时也能接收mouseMoveEvent     setMouseTracking(true); }  void CustomRectWidget::setIsChange(const QPoint &mousePos){     bool value = isMouseInsideRect(mousePos);     if(value==isChange){         return;     }     update();     isChange = value; }  void CustomRectWidget::paintEvent(QPaintEvent *event) {     Q_UNUSED(event)     QPainter painter(this);     painter.setRenderHint(QPainter::Antialiasing, true);      QColor borderColor = normalColor;     if (isMouseInsideRect(mapFromGlobal(QCursor::pos()))) {         borderColor = hoverColor;     }      painter.setPen(QPen(borderColor, 3));     painter.setBrush(Qt::white);     painter.drawRect(rect); }  void CustomRectWidget::mousePressEvent(QMouseEvent *event) {     setIsChange(event->pos());     if (isMouseInsideRect(event->pos())) {         dragging = true;         dragStartPoint = event->pos();     } }  void CustomRectWidget::mouseMoveEvent(QMouseEvent *event) {     setIsChange(event->pos());     if (dragging && isMouseInsideRect(dragStartPoint)) {         int dy = event->pos().y() - dragStartPoint.y();         rect.moveTop(rect.top() + dy);         dragStartPoint = event->pos();         update(); // Trigger repaint with new position     } }  void CustomRectWidget::mouseReleaseEvent(QMouseEvent *event) {     Q_UNUSED(event)     dragging = false; }  void CustomRectWidget::enterEvent(QEnterEvent *event) {     Q_UNUSED(event)     // We manually set the cursor in the mouseMoveEvent based on the rect position }  void CustomRectWidget::leaveEvent(QEvent *event) {     Q_UNUSED(event)     // Cursor will be reset to default when leaving the widget }  bool CustomRectWidget::isMouseInsideRect(const QPoint &mousePos) const {     bool ret = rect.contains(mousePos);     if(ret) {         qDebug()<<"in";     }else{         qDebug()<<"not in";     }     return ret; } 

 3.运行结果

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!