• qt 简单实验 一个可以向左侧拖拽缩放的矩形


    1.概要

    向左拖拽矩形,和向右拖拽不同,向右拖拽是增加宽度,向左拖拽是增加宽度的同时还要向左移动x的坐标。

    2.代码

    2.1 resizablerectangleleft.h

    1. #ifndef RESIZABLERECTANGLELEFT_H
    2. #define RESIZABLERECTANGLELEFT_H
    3. #include
    4. #include
    5. #include
    6. class ResizableRectangleLeft: public QWidget
    7. {
    8. Q_OBJECT
    9. public:
    10. ResizableRectangleLeft(QWidget *parent = nullptr);
    11. protected:
    12. void paintEvent(QPaintEvent *event);
    13. void mousePressEvent(QMouseEvent *event);
    14. void mouseMoveEvent(QMouseEvent *event);
    15. void mouseReleaseEvent(QMouseEvent *event);
    16. private:
    17. bool resizing; // 是否正在缩放
    18. int resizeWidth; // 矩形的当前宽度
    19. int xpoint = 100;
    20. QPoint originalMousePos; // 缩放开始时鼠标的位置
    21. };
    22. #endif // RESIZABLERECTANGLELEFT_H

    2.2 resizablerectangleleft.cpp

    1. #include "resizablerectangleleft.h"
    2. ResizableRectangleLeft::ResizableRectangleLeft(QWidget *parent) : QWidget(parent), resizing(false), resizeWidth(200) {}
    3. void ResizableRectangleLeft::paintEvent(QPaintEvent *event){
    4. QPainter painter(this);
    5. painter.setBrush(Qt::blue);
    6. QRect rectToDraw = QRect(xpoint, 0, resizeWidth, height());
    7. painter.drawRect(rectToDraw); // 绘制矩形
    8. }
    9. void ResizableRectangleLeft::mousePressEvent(QMouseEvent *event) {
    10. //if (event->button() == Qt::LeftButton && event->pos().x() < 10) { // 假设在矩形左侧10像素范围内按下右键开始缩放
    11. if (event->button() == Qt::LeftButton) { // 假设在矩形左侧10像素范围内按下右键开始缩放
    12. resizing = true;
    13. resizeWidth = width(); // 保存原始宽度
    14. originalMousePos = event->pos();
    15. }
    16. }
    17. void ResizableRectangleLeft::mouseMoveEvent(QMouseEvent *event) {
    18. if (resizing) {
    19. int delta = originalMousePos.x() - event->pos().x(); // 计算鼠标移动的距离
    20. if((xpoint -= delta)>0){
    21. xpoint -= delta;
    22. }
    23. if (resizeWidth + delta > 0) { // 确保矩形不会缩小到0以下
    24. resizeWidth += delta; // 调整矩形宽度
    25. update(); // 更新显示
    26. }
    27. originalMousePos = event->pos();
    28. }
    29. }
    30. void ResizableRectangleLeft::mouseReleaseEvent(QMouseEvent *event) {
    31. if (event->button() == Qt::RightButton) {
    32. resizing = false;
    33. }
    34. }

    2.3 widget.h

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. #include
    5. QT_BEGIN_NAMESPACE
    6. namespace Ui {
    7. class Widget;
    8. }
    9. QT_END_NAMESPACE
    10. class Widget : public QWidget
    11. {
    12. Q_OBJECT
    13. public:
    14. Widget(QWidget *parent = nullptr);
    15. ~Widget();
    16. protected:
    17. void mousePressEvent(QMouseEvent *event);
    18. private:
    19. Ui::Widget *ui;
    20. QLabel* lb_x;
    21. QLabel* lb_y;
    22. };
    23. #endif // WIDGET_H

    2.4 widget.cpp

    1. #include "widget.h"
    2. #include "ui_widget.h"
    3. //#include "resizablerectwidget.h"
    4. #include <QPushButton>
    5. //#include "resizablewidget.h"
    6. //#include "resizablerectangle.h"
    7. #include "resizablerectangleleft.h"
    8. Widget::Widget(QWidget *parent)
    9. : QWidget(parent)
    10. , ui(new Ui::Widget)
    11. {
    12. ui->setupUi(this);
    13. //QPushButton *button = new QPushButton("My Button", this);
    14. // 设置按钮的位置和大小(可选)
    15. // 注意:在 QMainWindow 中,你可能需要先设置一个 central widget 或其他容器
    16. //button->setGeometry(QRect(10, 10, 100, 30));
    17. //ResizableRectWidget* widget = new ResizableRectWidget(this);
    18. //widget->setGeometry(100, 100, 200, 100); // 设置初始位置和大小
    19. //widget.show();
    20. //ResizableWidget* p_rw = new ResizableWidget(this);
    21. //p_rw->setGeometry(0, 0, 200, 100); // 设置初始位置和大小
    22. //ResizableRectangle* p_RR = new ResizableRectangle(this);
    23. //p_RR->setGeometry(200, 200, 200, 100);
    24. ResizableRectangleLeft* p_rtl = new ResizableRectangleLeft(this);
    25. p_rtl->setGeometry(0, 200, 400, 100);
    26. //lb_x = new QLabel("x",this);
    27. //lb_x->setGeometry(0, 0, 200, 100);
    28. //lb_y = new QLabel("y",this);
    29. //lb_y->setGeometry(0, 50, 200, 100);
    30. }
    31. Widget::~Widget()
    32. {
    33. delete ui;
    34. }
    35. void Widget::mousePressEvent(QMouseEvent *event) {
    36. lb_x->setText(QString::number(event->pos().x()));
    37. lb_y->setText(QString::number(event->pos().y()));
    38. }

    2.5 main.cpp 

    3.运行

    3.1 拖拽前

    3.2 拖拽后

  • 相关阅读:
    Maya——1——在maya中,用Arnold(阿诺德)还原Subtance Painter(sp)中的材质效果。
    Xilinx FPGA管脚约束语法规则(UCF和XDC文件)
    go 地址 生成唯一索引 --chatGPT
    【GAMES202】A Glimpse of Industrial Solution—实时渲染中常用的工业界技术
    python基础语法(五)
    关于#python#的问题:flask怎么在接口发送响应后紧跟着触发目标函数啊
    论文阅读11——《Mutual Boost Network for Attributed Graph Clustering》
    python报错 AttributeError: ‘mpz‘ object has no attribute ‘to_bytes‘
    【Java数据结构与算法】LeetCode 0019. 删除链表的倒数第N个结点
    C语言:用一级指针访问二维数组的max,min
  • 原文地址:https://blog.csdn.net/xie__jin__cheng/article/details/139883896