Qt图层结构——实现ROI选取、选框放缩移动、背景图像移动放缩

交互式图像处理软件:组件选择与编辑
该博客介绍了基于Qk2dView的图像处理软件,包括BoardLayer、ComponentLayer、RecipeLayer和ResultLayer等组件。BoardLayer用于显示图像并处理缩放和平移,ComponentLayer支持组件的选择和编辑,允许用户调整组件大小和位置。RecipeLayer和ResultLayer则分别处理配方选择和结果显示。用户可以通过鼠标事件与软件进行交互,如双击选择组件,拖动调整区域等。

文件结构:

头文件boardlayer.h

#ifndef BOARDLAYER_H
#define BOARDLAYER_H

#include "qk2dview.h"
#include <QImage>

class BoardLayer : public Qk2dViewLayer
{
public:
    BoardLayer();

    const QImage& image() const { return m_image; }
    QTransform imageToWorld() const { return m_imgToWorld; }
    QTransform worldToImage() const { return m_worldToImg; }

private:
    void draw_ex(QPainter &painter) override;
    void calcTransform();

private:
    QImage m_image;
    QPointF m_origin;
    double m_pixelSize;
    QRectF m_worldRect; // image rect in world coordinate
    QTransform m_imgToWorld; // convert image coordinate to world coordinate
    QTransform m_worldToImg; // convert world coordinate to image coordinate
};



#endif // BOARDLAYER_H

 component.h

#ifndef COMPONENT_H
#define COMPONENT_H

#include <QPointF>
#include <QSizeF>
#include <vector>

struct Component
{
    Component(const QPointF &center, const QSizeF &size, float angle = 0)
        : m_pos(center)
        , m_size(size)
        , m_angle(angle)
        , m_unitVecX()
        , m_unitVecY()
        , m_vertex()
        , m_selected(false)
    {
        calcVertex();
    }

    void calcVertex();
    bool contains(const QPointF &point);

    QPointF m_pos;
    QSizeF m_size;
    float m_angle;

    QPointF m_unitVecX;
    QPointF m_unitVecY;
    QPointF m_vertex[8];

    bool m_selected;
};

extern std::vector<Component> g_m_components;

#endif // COMPONENT_H

componentlayer.h

#ifndef COMPONENTLAYER_H
#define COMPONENTLAYER_H

#include "qk2dview.h"
#include "component.h"

class ComponentLayer : public Qk2dViewLayer
{
public:
    ComponentLayer();

    void mousePressEvent(QMouseEvent *event) override;
    void mouseReleaseEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event) override;
    void mouseDoubleClickEvent(QMouseEvent *event) override;

private:
    void draw_ex(QPainter &painter) override;

private:
    Component* m_component;
    int m_hitVertex;
};

#endif // COMPONENTLAYER_H

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "qk2dview.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    Qk2dView m_view;
};
#endif // MAINWINDOW_H

qk2dview.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "qk2dview.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    Qk2dView m_view;
};
#endif // MAINWINDOW_H

recipelayer.h

#ifndef RECIPELAYER_H
#define RECIPELAYER_H

#include "qk2dview.h"

class RecipeLayer : public Qk2dViewLayer
{
public:
    RecipeLayer();

    void mousePressEvent(QMouseEvent *event) override;
    void mouseReleaseEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event) override;

private:
    void draw_ex(QPainter &painter) override;

private:
    bool m_selecting;
    QPointF m_selectStartPos;
    QPointF m_selectEndPos;
};

#endif // RECIPELAYER_H

resultlayer.h

#ifndef RESULTLAYER_H
#define RESULTLAYER_H

#include "qk2dview.h"

class ResultLayer : public Qk2dViewLayer
{
public:
    ResultLayer();

    void setText(const QString& text, bool status);

private:
    void draw_ex(QPainter &painter) override;

private:
    QString m_text;
    bool m_status;
};

#endif // RESULTLAYER_H


下面是源文件:

boardlayer.cpp

#include "boardlayer.h"
#include <QPointF>
#include <QPainter>
#include <QDebug>

BoardLayer::BoardLayer()
    : Qk2dViewLayer()
    , m_image("D:/testImage/0015.bmp")
    , m_origin(650, 50) // origin at (650, 50)设置图片起始位置
    , m_pixelSize(0.03) // 30 um / pixel收放比例
    , m_worldRect()
    , m_imgToWorld()
    , 
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI炮灰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值