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类型通常可以让代码更简洁。

相关推荐
人道领域9 分钟前
Day | 11 【苍穹外卖统计业务的实现:含详细思路分析】
java·数据库·后端·苍穹外卖
ZTLJQ7 小时前
数据的基石:Python中关系型数据库完全解析
开发语言·数据库·python
升鲜宝供应链及收银系统源代码服务7 小时前
《IntelliJ + Claude Code + Gemini + ChatGPT 实战配置手册升鲜宝》
java·前端·数据库·chatgpt·供应链系统·生鲜配送
跟着珅聪学java7 小时前
js编写中文转unicode 教程
前端·javascript·数据库
小江的记录本8 小时前
【Redis】Redis全方位知识体系(附《Redis常用命令速查表(完整版)》)
java·数据库·redis·后端·python·spring·缓存
还是做不到嘛\.8 小时前
Dvwa靶场-SQL Injection
数据库·sql·web安全
云飞云共享云桌面8 小时前
非标自动化研发成本高?云飞云共享云桌面:1台主机=10台工作站,年省数十万。
大数据·运维·服务器·人工智能·自动化·云计算·电脑
楼田莉子9 小时前
MySQL数据库:MySQL的数据类型
数据库·学习·mysql
2401_879693879 小时前
数据分析与科学计算
jvm·数据库·python
Linux运维技术栈9 小时前
生产环境Linux应用目录迁移至LVM独立分区 标准化实战方案
linux·运维·服务器·lvm·逻辑卷