qt 创建一个左侧边线拖拽的矩形

news2024/11/15 6:41:23

1.概要

2.代码

2.1 代码第一版

在Qt中,要创建一个可以向左侧拖拽边线的矩形,你需要自定义一个QGraphicsRectItem的子类,并重写其事件处理函数来响应鼠标的拖拽动作。以下是一个简单的实现示例:

#include <QApplication>  
#include <QGraphicsView>  
#include <QGraphicsScene>  
#include <QGraphicsRectItem>  
#include <QMouseEvent>  
  
class ResizableRectItem : public QGraphicsRectItem {  
public:  
    ResizableRectItem(const QRectF &rect, QGraphicsItem *parent = nullptr)  
        : QGraphicsRectItem(rect, parent),  
          dragging(false),  
          dragStartWidth(rect.width()),  
          edgeSensitivity(5) {}  
  
protected:  
    void mousePressEvent(QGraphicsSceneMouseEvent *event) override {  
        if (event->button() == Qt::LeftButton) {  
            QRectF rect = this->rect();  
            QPointF pos = event->pos();  
  
            if (pos.x() <= rect.x() + edgeSensitivity) {  
                // Left edge  
                dragging = true;  
                dragStartPos = pos;  
            }  
        }  
        QGraphicsRectItem::mousePressEvent(event);  
    }  
  
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override {  
        if (dragging) {  
            QPointF pos = event->pos();  
            qreal newWidth = dragStartWidth - (pos.x() - dragStartPos.x());  
            if (newWidth > 0) { // Prevent the rectangle from becoming negative width  
                this->setRect(QRectF(pos.x(), this->rect().y(), newWidth, this->rect().height()));  
            }  
        }  
        QGraphicsRectItem::mouseMoveEvent(event);  
    }  
  
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override {  
        dragging = false;  
        QGraphicsRectItem::mouseReleaseEvent(event);  
    }  
  
private:  
    bool dragging;  
    qreal dragStartWidth;  
    QPointF dragStartPos;  
    int edgeSensitivity;  
};  
  
int main(int argc, char *argv[]) {  
    QApplication app(argc, argv);  
    QGraphicsScene scene;  
    QGraphicsView view(&scene);  
  
    ResizableRectItem *rect = new ResizableRectItem(QRectF(50, 50, 200, 100));  
    scene.addItem(rect);  
  
    view.show();  
    return app.exec();  
}

在这个例子中,ResizableRectItem类有一个edgeSensitivity成员,它定义了鼠标可以离矩形左侧多远仍然被认为是拖拽左侧边线的范围。在mousePressEvent中,我们检查鼠标点击的位置是否在矩形的左侧边线附近。如果是,我们就开始拖拽操作。在mouseMoveEvent中,我们更新矩形的宽度,但不允许宽度变为负数。最后,在mouseReleaseEvent中,我们结束拖拽操作。

2.2 代码修正

#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QMouseEvent>
#include <QGraphicsSceneMouseEvent>

//https://blog.csdn.net/xie__jin__cheng/article/details/140438641?spm=1001.2014.3001.5501
//qt 创建一个矩形,矩形的边线可以拖拽
class ResizableRectItem : public QGraphicsRectItem {
public:
    ResizableRectItem(const QRectF &rect, QGraphicsItem *parent = nullptr)
        : QGraphicsRectItem(rect, parent),
        dragging(false),
        dragStartWidth(rect.width()),
        edgeSensitivity(5) {

    }

protected:
    void mousePressEvent(QGraphicsSceneMouseEvent *event) override {
        if (event->button() == Qt::LeftButton) {
            QRectF rect = this->rect();
            QPointF pos = event->pos();

            if (pos.x() <= rect.x() + edgeSensitivity) {
                // Left edge
                dragging = true;
                dragStartPos = pos;
            }
        }
        //QGraphicsRectItem::mousePressEvent(event);
    }

    void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override {
        if (dragging) {
            QPointF pos = event->pos();
            qreal newWidth = dragStartWidth - (pos.x() - dragStartPos.x());
            if (newWidth > 0) { // Prevent the rectangle from becoming negative width
                this->setRect(QRectF(pos.x(), this->rect().y(), newWidth, this->rect().height()));
            }
        }
        //QGraphicsRectItem::mouseMoveEvent(event);
    }

    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override {
        dragging = false;
        QGraphicsRectItem::mouseReleaseEvent(event);
    }

private:
    bool dragging;
    qreal dragStartWidth;
    QPointF dragStartPos;
    int edgeSensitivity;
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QGraphicsScene scene;
    QGraphicsView view(&scene);
    view.resize(500,500);

    ResizableRectItem *rect = new ResizableRectItem(QRectF(50, 50, 200, 100));
    scene.addItem(rect);

    view.show();
    return app.exec();
}

3.运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1928852.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DHCP服务、FTP服务

一、DHCP 1.1 DHCP是什么 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09;是一种网络协议&#xff0c;用于自动分配 IP 地址和其他网络配置信息给网络中的设备 1.2 DHCP的好处 自动化: 减少了手动配置 IP 地址和网络参数的工…

C++客户端Qt开发——常用控件(多元素控件)

5.多元素控件 Qt中提供的多元素控件有&#xff1a; QListWidget QListView QTablewidget QTableview QTreewidget QTreeview xxWidget和xView之间的区别 以QTableWidget和QTableView为例. QTableView是基于MVC设计的控件.QTableView自身不持有数据.使用QTableView的时候需要…

【密码学】密码学数学基础:剩余系

不得不啃的密码学数学基础之剩余系是个啥&#xff1f;数学里面有好多的定义都有前置的数学概念&#xff0c;要想弄懂剩余系还得先说说“同余”。 一、同余 那么“同余”有是个什么呢&#xff1f;在谈论“同余”之前&#xff0c;我们先圈定个讨论的范围。接下来讨论的都是整数集…

PyTorch Autograd内部实现

优化&#xff1a;如果is_leafFalse&#xff0c;则说明不需要该Tensor的grad&#xff0c;所以&#xff0c;grad_fn直接将output梯度传递给下一个grad_fn了&#xff0c;绕开对该Tensor的grad的更新&#xff1b;

C语言 | Leetcode C语言题解之第235题二叉搜索树的最近公共祖先

题目&#xff1a; 题解&#xff1a; struct TreeNode* lowestCommonAncestor(struct TreeNode* root, struct TreeNode* p, struct TreeNode* q) {struct TreeNode* ancestor root;while (true) {if (p->val < ancestor->val && q->val < ancestor-&g…

信息系统项目管理师(高项)—学习笔记二

第一章 以下是上一篇&#xff08;信息系统项目管理师&#xff08;高项&#xff09;—学习笔记&#xff09;的续写&#xff0c;因为是之前记录的&#xff0c;这一篇还是细致到每一个小节的内容&#xff0c;有些过于复杂了&#xff0c;后续会简化~ 1.3 现代化创新发展 党的十九…

干货丨ChatGPT高阶玩法(上)

正文共1321字 预计阅读时间4分钟 是的,你没有看错,上面这段这么像人写的内容其实是由ChatGPT这个机器人AI生成的(我只稍加修改了几个字),发送下面第一个提示词口令,然后加以进一步引导并不断改进就可以得到你想要的结果,具体操作见文中图片。 使用说明 以下【】里的内…

Unable to obtain driver using Selenium Manager: Selenium Manager failed解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

《Windows API 每日一练》10.1 模态对话框

对话框分“模态”和“非模态”两种&#xff0c;其中模态对话框最为常见。当程序显示一个模态对话框时&#xff0c;用户不能在对话框和该程序的其他窗口之间进行切换。用户必须先明确地终止该对话框。这通常由单击OK或Cancel按钮来实现。但是当对话框正在显示时&#xff0c;用户…

[Linux]基本指令(二)

一些剩下的指令部分 mv指令&#xff08;重要&#xff09; mv 命令是 move 的缩写&#xff0c;可以用来移动文件或者将文件改名&#xff08; move (rename) files &#xff09;&#xff0c;是 Linux 系统下常用的命令&#xff0c; 经常用来备份文件或者目录。 语法 : mv [ 选项…

京东.Vision首登苹果Vision Pro 背后的技术探索

去年6月&#xff0c;苹果正式发布首款头显设备Apple Vision Pro&#xff0c;今年6月28号&#xff0c;Apple Vision Pro正式在中国发售。京东.Vision作为首批原生应用登陆Vision Pro平台&#xff0c;首期以家电家居与潮流数码产品作为切入口&#xff0c;未来将逐步拓展至全品类&…

基于 jenkins 部署接口自动化测试项目!

引言 在现代软件开发过程中&#xff0c;自动化测试是保证代码质量的关键环节。通过自动化测试&#xff0c;可以快速发现和修复代码中的问题&#xff0c;从而提高开发效率和产品质量。而 Jenkins 作为一款开源的持续集成工具&#xff0c;可以帮助我们实现自动化测试的自动化部署…

python编程:从入门到实践(第三版) 笔记

文章目录 资源网站:https://www.ituring.com.cn/book/3038配置VSCode推荐资源网站推荐资源网址 资源网站:https://www.ituring.com.cn/book/3038 配置VSCode 推荐资源网站 推荐资源网址 英文版主页&#xff1a; https://ehmatthes.github.io/pcc_3e 中文版主页&#xff1a; h…

【人工智能】Transformers之Pipeline(二):自动语音识别(automatic-speech-recognition)

​​​​​​​ 目录 一、引言 二、自动语音识别&#xff08;automatic-speech-recognition&#xff09; 2.1 概述 2.2 技术原理 2.2.1 whisper模型 2.2.2 Wav2vec 2.0模型 2.3 pipeline参数 2.3.1 pipeline对象实例化参数​​​​​​​ 2.3.2 pipeline对象使用参数…

MFC程序创建word,创建表格,写入数据

文章目录 1、MFC程序功能&#xff1a;2、MFC程序实现2.1 创建项目2.2 添加word操作类2.3 添加word资源2.4 编写代码&#xff0c;实现将数据写入到word2.5 运行程序、验证功能3、工程代码下载 1、MFC程序功能&#xff1a; 创建word文档&#xff1b;向文档中写入字符串&#xff…

【首发】分享一款三网话费余额查询的API系统

描述 对于计算机专业的小伙伴来说&#xff0c;多熟悉一个系统就多一份就业机会&#xff01; 今天给大家分享一款三网话费余额查询的API系统 亲测可运行&#xff01;&#xff01; 内容 目前主要的内容以php为主&#xff0c;对于学习php有比较大的帮助&#xff01; 但是网络上…

爬虫兽-抖音评论提取截流工具|评论爬虫|视频评论提取-拓客

抖音评论提取软件使用说明 抖音视频评论提取到的内容&#xff1a;1&#xff1a;视频名称 2&#xff1a;视频作者 3&#xff1a;作者地址 4&#xff1a;视频地址 5&#xff1a;评论人昵称。6&#xff1a;评论人主页地址。7&#xff1a;评论内容 8&#xff1a;评论日期 一&…

品牌形象的智能塑造:Kompas.ai如何构建品牌视觉识别

品牌形象是企业在消费者心中构建的独特印象&#xff0c;它对于品牌识别和记忆度至关重要。一个一致且具有辨识度的品牌形象能够帮助企业在激烈的市场竞争中脱颖而出。Kompas.ai&#xff0c;作为一款智能设计工具&#xff0c;正帮助品牌塑造和维护其独特的视觉识别系统。 一致的…

绿色积分引领消费增值浪潮“

尊敬的顾客们&#xff0c;大家好&#xff01;在此&#xff0c;我满怀热情地与您分享一个革命性的消费新观念——消费增值&#xff0c;旨在让您的每一笔消费都焕发出前所未有的价值&#xff01; 长久以来&#xff0c;我们的消费习惯似乎总是单向的&#xff1a;花钱&#xff0c;…

量化交易研究报告#13

核心公式 通过对 HS300 相对强弱指标值变化规律的梳理&#xff0c;我们制定如下的交易法则&#xff1a; &#xff08;1&#xff09;计算指标的 20 日均值变化&#xff0c;以及 20 日标准差&#xff1b; &#xff08;2&#xff09;20日均值1倍标准差作为上阈值&#xff0c;20…