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

相关推荐
00后程序员张21 小时前
【Python】基于 PyQt6 和 Conda 的 PyInstaller 打包工具
运维·服务器·数据库
huihuihuanhuan.xin21 小时前
后端八股之Redis
数据库·redis·缓存
情深不寿31721 小时前
MySQL————数据库基础
数据库·mysql
程序新视界1 天前
如何选择合适的数据库?PostgreSQL与MySQL各项对比
数据库·mysql·postgresql
我言秋日胜春朝★1 天前
【Linux网络编程】多路转接reactor——ET模式的epoll
linux·服务器·网络
共享家95271 天前
QT-常用控件(三)-显示类
开发语言·qt
明月与玄武1 天前
SQL核心语言详解:DQL、DML、DDL、DCL从入门到实践!
数据库·sql核心语言详解·dql、dml、ddl、dcl
焦思懿--19期--工职大1 天前
VMWare和物理机之间文件传输
linux·服务器·网络·电脑
7hhhhhhh1 天前
驱动开发-Linux启动
运维·服务器
dongchen。1 天前
MySQL第一次作业
数据库·mysql