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

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.运行结果

相关推荐
西飘客5 小时前
vs 怎么根据dll 生成lib文件
c++·qt
bkspiderx6 小时前
Qt 插件机制:动态扩展应用功能的核心框架
开发语言·qt·元数据·qt 插件·qpluginloader
半杯咖啡半行码8 小时前
Qt开发实战:数据库、MV 模式、QProcess与串口通信全攻略
数据库·qt
时间的拾荒人9 小时前
Qt 界面优化:绘图详解 —— 从基础图形到图片处理
开发语言·qt·面试
MayZork10 小时前
Qt 文件操作:QSaveFile 与 QTemporaryFile(含 QTemporaryDir)实战
开发语言·qt
半杯咖啡半行码13 小时前
Qt 开发基础:版本演进、常用工具与多平台安装
开发语言·qt
qq_4017004118 小时前
Qt Signal Mapper:一堆按钮,怎么共用一个槽函数
开发语言·qt
Python图像识别18 小时前
35-【2027毕设】YOLO11中草药检测识别系统 - Python完整源码+PyQt5界面+训练模型+数据集
python·qt·课程设计
Lhan.zzZ19 小时前
Qt/QML:业务记录单展示、签名确认与 PDF 导出开发
c++·qt·pdf
Quz1 天前
QML 动画选择:GIF与Lottie 的区别,以及 Qt 6.8 与 6.11 的 Lottie 实现差异
qt