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

相关推荐
元亓亓亓1 分钟前
考研408--计算机网络--day12--网络应用模型&DNS&FTP
服务器·计算机网络·考研·408
java1234_小锋29 分钟前
Redis的热Key问题如何解决?
数据库·redis·缓存
wang60212521833 分钟前
FastAPI框架为什么在启动时建表
数据库
男孩李35 分钟前
linux下如何执行postgres数据库的sql文件
数据库·sql·postgresql
小李独爱秋39 分钟前
计算机网络经典问题透视:在浏览器中应当有几个可选解释程序?
服务器·网络·网络协议·tcp/ip·计算机网络
zwjapple39 分钟前
MySQL SQL 面试核心考点与注意事项总结
数据库·sql·mysql
乐韵天城40 分钟前
SpringBoot中如何手动开启数据库事务
数据库·spring boot
05大叔1 小时前
Spring Day02
数据库·sql·spring
默默前行的虫虫1 小时前
nicegui中多次调用数据库操作总结
数据库·python
鸽鸽程序猿1 小时前
【Redis】事务
数据库·redis·缓存