qt 创建一个矩形,矩形的边线可以拖拽,别用auto类型,用实际的类型

在Qt中,创建一个矩形并使其边线可以拖拽,而不使用auto类型,你可以明确指定所有变量的类型。以下是一个修改后的示例,其中避免了auto类型:

复制代码
#include <QApplication>  
#include <QGraphicsView>  
#include <QGraphicsScene>  
#include <QGraphicsRectItem>  
#include <QMouseEvent>  
#include <QPointF>  
#include <QSizeF>  
#include <QRectF>  
  
class ResizableRectItem : public QGraphicsRectItem {  
public:  
    ResizableRectItem(const QRectF &rect, QGraphicsItem *parent = nullptr)  
        : QGraphicsRectItem(rect, parent),  
          dragging(false),  
          dragStartSize(QSizeF()),  
          dragStartPos(QPointF()) {}  
  
protected:  
    void mousePressEvent(QGraphicsSceneMouseEvent *event) override {  
        if (event->button() == Qt::LeftButton) {  
            QRectF rect = this->rect();  
            QPointF pos = event->pos();  
            QSizeF size = rect.size();  
            const int edgeSensitivity = 5; // Pixels  
  
            if (qAbs(pos.x() - rect.x()) < edgeSensitivity) {  
                // Left edge  
                dragging = true;  
                dragStartSize = size;  
                dragStartPos = pos;  
                currentEdge = LeftEdge;  
            } else if (qAbs(pos.x() - (rect.x() + rect.width())) < edgeSensitivity) {  
                // Right edge  
                dragging = true;  
                dragStartSize = size;  
                dragStartPos = pos;  
                currentEdge = RightEdge;  
            } else if (qAbs(pos.y() - rect.y()) < edgeSensitivity) {  
                // Top edge  
                dragging = true;  
                dragStartSize = size;  
                dragStartPos = pos;  
                currentEdge = TopEdge;  
            } else if (qAbs(pos.y() - (rect.y() + rect.height())) < edgeSensitivity) {  
                // Bottom edge  
                dragging = true;  
                dragStartSize = size;  
                dragStartPos = pos;  
                currentEdge = BottomEdge;  
            }  
        }  
        QGraphicsRectItem::mousePressEvent(event);  
    }  
  
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override {  
        if (dragging) {  
            QPointF pos = event->pos();  
            QSizeF newSize = dragStartSize;  
  
            switch (currentEdge) {  
                case LeftEdge:  
                    newSize.setWidth(dragStartSize.width() - (dragStartPos.x() - pos.x()));  
                    this->setRect(QRectF(pos.x(), this->rect().y(), newSize.width(), this->rect().height()));  
                    break;  
                case RightEdge:  
                    newSize.setWidth(dragStartSize.width() + (pos.x() - dragStartPos.x()));  
                    this->setRect(QRectF(this->rect().x(), this->rect().y(), newSize.width(), this->rect().height()));  
                    break;  
                case TopEdge:  
                    newSize.setHeight(dragStartSize.height() - (dragStartPos.y() - pos.y()));  
                    this->setRect(QRectF(this->rect().x(), pos.y(), this->rect().width(), newSize.height()));  
                    break;  
                case BottomEdge:  
                    newSize.setHeight(dragStartSize.height() + (pos.y() - dragStartPos.y()));  
                    this->setRect(QRectF(this->rect().x(), this->rect().y(), this->rect().width(), newSize.height()));  
                    break;  
            }  
        }  
        QGraphicsRectItem::mouseMoveEvent(event);  
    }  
  
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override {  
        dragging = false;  
        QGraphicsRectItem::mouseReleaseEvent(event);  
    }  
  
private:  
    bool dragging;  
    QSizeF dragStartSize;  
    QPointF dragStartPos;  
    enum Edge { LeftEdge, RightEdge, TopEdge, BottomEdge };  
    Edge currentEdge;  
};  
  
class MainWindow : public QGraphicsView {  
public:  
    MainWindow(QWidget *parent = nullptr) : QGraphicsView(parent) {  
        QGraphicsScene *scene = new QGraphicsScene(this);  
        this->setScene(scene);  
  
        ResizableRectItem *rect = new ResizableRectItem(QRectF(10, 10, 200, 100));  
        scene->addItem(rect);  
    }  
};  
  
int main(int argc, char *argv[]) {  
    QApplication app(argc, argv);  
    MainWindow window;  
    window.resize(400, 300);  
    window.show();  
    return app.exec();  
}

在这个示例中,我避免了使用auto类型,而是明确指定了所有变量的类型,包括QGraphicsSceneResizableRectItemMainWindow中的成员变量和局部变量。这样,代码的可读性和明确性可能会得到提高,尽管使用auto类型通常可以让代码更简洁。

相关推荐
Yushan Bai1 分钟前
RAC环境数据文件读取异常导致实例重启
数据库·oracle
小猿姐3 分钟前
当KubeBlocks遇上国产数据库之Kingbase:让信创数据库“飞得更高”
运维·数据库·云原生
小李的便利店7 分钟前
系统架构设计师-案例分析-数据库系统设计
数据库·系统架构
似水এ᭄往昔9 分钟前
【Linux】--进程概念
linux·运维·服务器
IDIOT___IDIOT9 分钟前
Linux 使用 `cp` 命令导致挂载点被覆盖问题记录
linux·运维·服务器
洛菡夕16 分钟前
MySQL全量、增量备份与恢复
数据库·mysql
Sunia33 分钟前
《Spring AI + 大模型全栈实战》学习手册系列 · 专题二:《Milvus 向量数据库:从零开始搭建 RAG 系统的核心组件》
数据库
RisunJan39 分钟前
Linux命令-mount(用于挂载Linux系统外的文件)
linux·运维·服务器
絆人心41 分钟前
最新 SQL 常用语句大全(新手入门 + 老手速查,含 DQL/DML/DDL)
数据库·sql·oracle
脆皮炸鸡7551 小时前
Linux开发工具~~~版本控制器Git以及调试工具GDB
linux·服务器·开发语言·经验分享·git·学习方法