QPainter-最简单的方式实现以鼠标为中心缩放

项目场景:

最近有个项目,要实现FPGA原理图功能,其中涉及到以鼠标为中心缩放的问题,效果应该和CAD的缩放效果类似,顺便也做个记录。


废话不多说,直接上代码

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include"draw_figure.h"
#include<QScrollBar>
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    bool eventFilter(QObject *object, QEvent *event);

public:
    draw_figure drawFigure;
public slots:
    void getWheelSlot(QWheelEvent *event);


private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

	}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->scrollArea->setWidget(&drawFigure);
    connect(&drawFigure,&draw_figure::mouseWheelZoom,this,&MainWindow::getWheelSlot);
    ui->scrollArea->setWidgetResizable(true);
    ui->scrollArea->viewport()->installEventFilter(this);//QSCrollArea 滚动区域是viewport()
}

MainWindow::~MainWindow()
{
    delete ui;
}
bool MainWindow::eventFilter(QObject *target, QEvent *event)
{
    if(target == ui->scrollArea->viewport())
    {
        if(event->type() == QEvent::Wheel)
        {
            event->ignore();
            return true;      //只针对scrollArea窗口禁用滚轮滚动功能,返回true表示过滤
        }else {
            return false;//返回false表示不过滤
        }
    }
    else
    {
        return false;
    }
}

void MainWindow::getWheelSlot(QWheelEvent *event)
{
    QScrollBar *tmph = ui->scrollArea->horizontalScrollBar();
    QScrollBar *tmpv = ui->scrollArea->verticalScrollBar();
    QPoint pos = event->pos();
    if(event->delta()>0)
    {
        drawFigure.scale *=1.05;
        drawFigure.setFixedSize(drawFigure.width()*1.05,drawFigure.height()*1.05);
        double value_x = event->x()*1.05 - event->x();
        tmph->setValue( tmph->value()+ value_x);
        double value_y = event->y()*1.05 - event->y();
        tmpv->setValue(tmpv->value()+ value_y);
    }else{
        drawFigure.setFixedSize(drawFigure.width()/1.05,drawFigure.height()/1.05);
        drawFigure.scale =drawFigure.scale/1.05;
        double value_x = event->x()/1.05 - event->x();
        double value_y = event->y()/1.05 - event->y();
        tmph->setValue( tmph->value()+ value_x);
        tmpv->setValue(tmpv->value()+ value_y);
    }
}

draw_figure.h

#ifndef DRAW_FIGURE_H
#define DRAW_FIGURE_H

#include <QWidget>
#include<QWheelEvent>
#include<QPaintEvent>
#include<QPainter>
#include<QDebug>
#include<QMouseEvent>
#include<QScrollBar>
#include<QAbstractScrollArea>

class draw_figure : public QWidget
{
    Q_OBJECT
public:
    explicit draw_figure(QWidget *parent = nullptr);
    double scale=1.0;
protected:
    void paintEvent(QPaintEvent *event);
    void wheelEvent(QWheelEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mousePressEvent(QMouseEvent *event);
signals:
    void mouseWheelZoom(QWheelEvent *event);
public slots:
};

#endif // DRAW_FIGURE_H

draw_figure.cpp

#include "draw_figure.h"

draw_figure::draw_figure(QWidget *parent) : QWidget(parent)
{
    setCursor(Qt::CrossCursor);
}

void draw_figure::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.scale(scale,scale);
    painter.drawRect(200,100,300,600);
}

void draw_figure::wheelEvent(QWheelEvent *event)
{
    if (event->delta() > 0)
    {
        emit mouseWheelZoom(event);
    }
    else
    {
        emit mouseWheelZoom(event);
    }
}

void draw_figure::mouseMoveEvent(QMouseEvent *event)
{
    //    qDebug()
}

void draw_figure::mousePressEvent(QMouseEvent *event)
{
//    qDebug()<<event->pos();
}


敲黑板:别用resize(),应该用setFixedSize();

setFixedSize()是设置最大最小值,如果调用resize(X,Y),X,Y小于最大的时候,resize不生效。


手懒的同学,点这里: 最简单的方式实现QPainter以鼠标为中心缩放.

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
您可以通过Qt的信号和槽机制来实现鼠标点击按钮图片放大功能。 首先,您需要在界面上添加一个按钮和一个用于显示图片的控件。然后,使用Qt的信号和槽机制连接按钮的点击事件和图片的放大功能。 在连接信号和槽之前,您需要编写一个函数来处理图片的放大逻辑。您可以使用引用中描述的方法来实现图片的放大缩小。 接下来,您可以将按钮的clicked()信号与放大函数进行连接,以便在按钮被点击时执行放大操作。 下面是一个示例代码,演示了如何使用Qt实现鼠标点击按钮图片放大功能: ```cpp // 头文件中声明按钮和图片控件 #include <QPushButton> #include <QLabel> class MyWidget : public QWidget { Q_OBJECT public: MyWidget(QWidget *parent = nullptr) : QWidget(parent) { // 创建按钮和图片控件 QPushButton *button = new QPushButton("放大图片", this); QLabel *imageLabel = new QLabel(this); // 设置图片控件的大小和位置 imageLabel->setGeometry(100, 100, 200, 200); // 连接按钮的点击事件和放大函数 connect(button, &QPushButton::clicked, this, &MyWidget::zoomImage); } private slots: void zoomImage() { // 在这里实现图片放大的逻辑,可以参考引用中的方法 // 当按钮被点击时,图片放大显示 // 可以使用QLabel的setPixmap()来设置放大后的图片 // 当再次点击按钮时,图片恢复原大小 // 示例代码: static bool isZoomed = false; // 标记图片是否已放大 if (isZoomed) { // 图片已放大,执行缩小操作 // 可以使用QLabel的setPixmap()来设置缩小后的图片 // 可以使用QLabel的clear()函数来清除图片 } else { // 图片未放大,执行放大操作 // 可以使用QLabel的setPixmap()来设置放大后的图片 } isZoomed = !isZoomed; // 切换图片放大状态 } }; ``` 通过上述代码,您可以实现一个简单Qt程序,当按钮被点击时,图片将放大显示。您可以根据自己的需求修改和完善代码,以达到更好的用户体验。 : 界面上有三张图片,当鼠标指针移动到某图片之上,该图片会放大显示,当鼠标移到另一张图片之上时,前一张图片变为原大小,后一张图片放大显示 : 可自适应显示图片,以鼠标位置为中心进行缩放,按住鼠标左键进行图片拖动,可添加截图方框并截图保存,可载入显示大部分tif格式的图,可显示伪彩,灰度图。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值