创建一个矩形,当鼠标进入这个矩形的时候,这个矩形边线变色,且鼠标变成手型
1.概要
创建一个矩形,当鼠标进入这个矩形的时候,这个矩形边线变色,且鼠标变成手型
(图片来源网络,侵删)
2.代码
#include
#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
#include
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
#include
#include
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()
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!
