首页 > 其他分享 >qt 简单实验 一个可以向右侧拖拽缩放的矩形

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

时间:2024-06-22 14:57:57浏览次数:23  
标签:ResizableRectangle Widget qt 缩放 void widget 拖拽 include event

1.概要

目的是设置一个可以拖拽缩放的矩形,这里仅用右侧的一个边模拟这个过程。就是为了抓住核心,这个便解决了,其他的边也是一样的。而这个更能体现原理。

2.代码

2.1 resizablerectangle.h

#ifndef RESIZABLERECTANGLE_H
#define RESIZABLERECTANGLE_H

#include <QWidget>
#include <QMouseEvent>
#include <QPainter>

class ResizableRectangle: public QWidget
{
     Q_OBJECT
public:
    ResizableRectangle(QWidget *parent = nullptr);
protected:
    void paintEvent(QPaintEvent *event);
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
private:
    bool resizing; // 是否正在缩放
    QPoint resizePos; // 缩放起始位置
};

#endif // RESIZABLERECTANGLE_H

2.2 resizablerectangle.cpp

#include "resizablerectangle.h"


ResizableRectangle::ResizableRectangle(QWidget *parent) : QWidget(parent), resizing(false), resizePos(0, 0) {}

void ResizableRectangle::paintEvent(QPaintEvent *event) {
    QPainter painter(this);
    painter.setBrush(Qt::blue);
    painter.drawRect(rect()); // 绘制矩形,你可以根据需要设置矩形的样式
}

void ResizableRectangle::mousePressEvent(QMouseEvent *event) {
    if (event->button() == Qt::LeftButton && event->pos().x() > width() - 10) { // 假设在矩形右侧10像素范围内按下右键开始缩放
        resizing = true;
        resizePos = event->pos();
    }
}

void ResizableRectangle::mouseMoveEvent(QMouseEvent *event) {
    if (resizing) {
        int delta = event->pos().x() - resizePos.x(); // 计算鼠标移动的距离
        resize(width() + delta, height()); // 调整矩形大小
        resizePos = event->pos(); // 更新缩放起始位置
        update(); // 更新显示
    }
}

void ResizableRectangle::mouseReleaseEvent(QMouseEvent *event) {
    if (event->button() == Qt::LeftButton) {
        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"


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);

    //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

#include "widget.h"
//#include "resizablewidget.h"

#include <QApplication>
//创建一个可以拖拽并且缩放的矩形
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    //ResizableWidget rw;
    //rw.show();
    return a.exec();
}

3.运行结果

 

标签:ResizableRectangle,Widget,qt,缩放,void,widget,拖拽,include,event
From: https://blog.csdn.net/xie__jin__cheng/article/details/139882542

相关文章

  • qt开发-08_layout 布局
    Qt提供了非常丰富的布局类,基本布局管理类包括:QBoxLayout、QGridLayout、QFormLayout和QStackedLayout。这些类都从QLayout继承而来,它们都来源于QObject(而不是QWidget)。创建更加复杂的布局,可以让它们彼此嵌套完成。其中QBoxLayout提供了水平和垂直的布局管理;QFormLa......
  • Qt+OpenCV通用视觉框架全套源码,类似easyvision
    Qt+OpenCV通用视觉框架全套源码,类似easyvision。工具可扩展。所有算法均无封装,可以根据自己需要补充自己的工具。基于Qt5.12.12+VS2019+OpenCV开发实现,支持多相机多线程,每个工具都是单独的DLL,主程序通过公用的接口访问以及加载各个工具。包含涉及图像算法的工具、......
  • 使用mongodb、Kafka保存mqtt消息
    一、引言随着物联网技术的迅猛发展,大量的设备和传感器产生了海量的数据。本文利用了MQTT、Kafka和MongoDB各自的优点,满足实时数据处理和大规模数据存储的需求。如图:二、总结优点:1.可靠和解耦:Kafka的复制机制和持久化存储确保了数据在传输过程中的可靠性,即使某个节点......
  • 深度学习--seqt2seq RNN 英语翻译法语--86
    目录1.结构2.代码解读1.结构我画的:2.代码解读导包importnltkimportnumpyasnpimportreimportshutilimporttensorflowastfimportosimportunicodedatafromnltk.translate.bleu_scoreimportsentence_bleu,SmoothingFunction数据集的预处理defcl......
  • Qt QTreeView 常见节点操作
    QTreeView作为项目最经常使用的空间,常用接口和操作必须熟悉熟悉在熟悉!!!1、节点遍历1voidParamSettingDlg::GetNode()2{3for(inti=0;i<model->rowCount();i++)4{5QStandardItem*item=model->item(i);67qDebug()<<"item......
  • Qt 文件模型(QFileSystemModel)详细介绍
    一.定义Qt提供了QFileSystemModel类,用于在Qt应用程序中展示文件系统的数据。QFileSystemModel类是QAbstractItemModel的子类,可以方便地将文件系统的文件和文件夹结构作为数据模型,供Qt的视图类(比如QTreeView、QListView等)使用。二.功能设置根路径:使用setRootPath()方法设置......
  • 2023年天津大学图像工程课程设计 基于 OpenCV 、 Qt 库的图像处理软件+源代码+文档说
    文章目录源码下载地址项目介绍项目功能界面预览项目备注源码下载地址源码下载地址点击这里下载代码项目介绍图像工程课程设计基于OpenCV、Qt库实现的图像处理软件大学编程作业(TUST天津科技大学2023年)图像工程课程设计基于OpenCV、Qt库实现的图像处......
  • Qt QTableView插入控件,qss设计
    环境Qt5.4.2功能QtQTableView插入控件,qss设计源码1.mainwindow.hclassMyComboBox;classMyDoubleSpinBox;classMainWindow:publicQMainWindow{Q_OBJECTpublic:explicitMainWindow(QWidget*parent=0);~MainWindow();private:Ui:......
  • Qt widget 鼠标拖拽,分离新窗口
    环境Qt5.4.2功能鼠标拖拽widget,分离出新的窗口,鼠标关闭窗口后,widget恢复之前的位置源码1.mainWindow.hclassMainWindow:publicQMainWindow{private:QWidget*ObjWidget;QWidget*Widget1;QWidget*Widget2;QWidget*Widget3;QWid......
  • QT/QMessageBox/QTimerEvent/使用定时器制作一个闹钟
    1.使用定时器制作一个闹钟代码:widget.cpp:#include"widget.h"#include"ui_widget.h"Widget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget),speecher(newQTextToSpeech(this))//给语音对象申请空间{ui->setupUi(this);......