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

1.概要

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

2.代码

2.1 resizablerectangleleft.h

#ifndef RESIZABLERECTANGLELEFT_H
#define RESIZABLERECTANGLELEFT_H
#include <QWidget>
#include <QMouseEvent>
#include <QPainter>

class ResizableRectangleLeft: public QWidget
{
    Q_OBJECT
public:
    ResizableRectangleLeft(QWidget *parent = nullptr);
protected:
    void paintEvent(QPaintEvent *event);
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
private:
    bool resizing; // 是否正在缩放
    int resizeWidth; // 矩形的当前宽度
    int xpoint = 100;
    QPoint originalMousePos; // 缩放开始时鼠标的位置
};

#endif // RESIZABLERECTANGLELEFT_H

2.2 resizablerectangleleft.cpp

#include "resizablerectangleleft.h"

ResizableRectangleLeft::ResizableRectangleLeft(QWidget *parent) : QWidget(parent), resizing(false), resizeWidth(200) {}

void ResizableRectangleLeft::paintEvent(QPaintEvent *event){
    QPainter painter(this);
    painter.setBrush(Qt::blue);
    QRect rectToDraw = QRect(xpoint, 0, resizeWidth, height());
    painter.drawRect(rectToDraw); // 绘制矩形
}

void ResizableRectangleLeft::mousePressEvent(QMouseEvent *event) {
    //if (event->button() == Qt::LeftButton && event->pos().x() < 10) { // 假设在矩形左侧10像素范围内按下右键开始缩放
    if (event->button() == Qt::LeftButton) { // 假设在矩形左侧10像素范围内按下右键开始缩放
        resizing = true;
        resizeWidth = width(); // 保存原始宽度
        originalMousePos = event->pos();
    }
}

void ResizableRectangleLeft::mouseMoveEvent(QMouseEvent *event) {
    if (resizing) {
        int delta = originalMousePos.x() - event->pos().x(); // 计算鼠标移动的距离
        if((xpoint -= delta)>0){
            xpoint -= delta;
        }
        if (resizeWidth + delta > 0) { // 确保矩形不会缩小到0以下
            resizeWidth += delta; // 调整矩形宽度
            update(); // 更新显示
        }
        originalMousePos = event->pos();
    }
}

void ResizableRectangleLeft::mouseReleaseEvent(QMouseEvent *event) {
    if (event->button() == Qt::RightButton) {
        resizing = false;
    }
}

2.3 widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLabel>

QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
protected:
    void mousePressEvent(QMouseEvent *event);
private:
    Ui::Widget *ui;
    QLabel* lb_x;
    QLabel* lb_y;
};
#endif // WIDGET_H

2.4 widget.cpp

#include "widget.h"
#include "ui_widget.h"
//#include "resizablerectwidget.h"
#include <QPushButton>
//#include "resizablewidget.h"
//#include "resizablerectangle.h"
#include "resizablerectangleleft.h"


Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //QPushButton *button = new QPushButton("My Button", this);
    // 设置按钮的位置和大小(可选)
    // 注意:在 QMainWindow 中,你可能需要先设置一个 central widget 或其他容器
    //button->setGeometry(QRect(10, 10, 100, 30));

    //ResizableRectWidget* widget = new ResizableRectWidget(this);
    //widget->setGeometry(100, 100, 200, 100); // 设置初始位置和大小
    //widget.show();

    //ResizableWidget* p_rw = new ResizableWidget(this);
    //p_rw->setGeometry(0, 0, 200, 100); // 设置初始位置和大小

    //ResizableRectangle* p_RR = new ResizableRectangle(this);
    //p_RR->setGeometry(200, 200, 200, 100);

    ResizableRectangleLeft* p_rtl = new ResizableRectangleLeft(this);
    p_rtl->setGeometry(0, 200, 400, 100);

    //lb_x = new QLabel("x",this);
    //lb_x->setGeometry(0, 0, 200, 100);
    //lb_y = new QLabel("y",this);
    //lb_y->setGeometry(0, 50, 200, 100);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::mousePressEvent(QMouseEvent *event) {
    lb_x->setText(QString::number(event->pos().x()));
    lb_y->setText(QString::number(event->pos().y()));
}

2.5 main.cpp 

3.运行

3.1 拖拽前

3.2 拖拽后

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值