首页 > 其他分享 >Qt给QGraphicsView添加一个缩略图

Qt给QGraphicsView添加一个缩略图

时间:2022-11-24 19:44:37浏览次数:59  
标签:QGraphicsView MGraphicsView Qt 缩略图 int xinfo void yinfo Thumb

此功能在某些应用里可能会使用到。主要是在QGraphicsView的左上角显示一个小的缩略图,并绘制一个矩形指示当前界面处在整个视图的哪个位置。我实现该功能是用MGraphicsView类继承QGraphicsView,并在其resizeEvent内初始化缩略图。这就要求要在MGraphicsView显示之前给它添加QGraphicsScene和QGraphicsItem,使其在初始化时视图内已有内容;否则它显示的缩略图是空的。你可以在主窗口的构造函数内添加内容。如果你想延迟添加内容,就要修改MGraphicsView的代码。这也很简单,因为整个功能才一百多行代码。下面是效果图(可以看到左上角缩略图中的黑色矩形展示了当前界面处在整个视图的位置):

下面是源代码,头文件:

class MGraphicsView : public QGraphicsView
{
    Q_OBJECT

public:
    MGraphicsView(QWidget *parent = 0);

private slots:
    void scrollBarValueChanged();

private:
    void resizeEvent(QResizeEvent *event) override;
    void updateThumbRoi();

    struct PosInfo
    {
        int min;
        int max;
        int value;
        int page;
    };

private:
    class Thumb;
    Thumb *thumb;
};

class MGraphicsView::Thumb : public QWidget
{
    Q_OBJECT

public:
    using PosInfo = MGraphicsView::PosInfo;
    Thumb(QWidget* parent = 0);
    void updateImage();
    void updateRoi(const PosInfo& xinfo, const PosInfo& yinfo);

private:
    void paintEvent(QPaintEvent *event) override;

private:
    QPixmap background;
    QRect roi;
};

CPP文件:

MGraphicsView::MGraphicsView(QWidget *parent) :
    QGraphicsView(parent)
{
    thumb = new Thumb(this);
    QScrollBar* hsb = horizontalScrollBar();
    connect(hsb, &QScrollBar::valueChanged, this, &MGraphicsView::scrollBarValueChanged);
    QScrollBar* vsb = verticalScrollBar();
    connect(vsb, &QScrollBar::valueChanged, this, &MGraphicsView::scrollBarValueChanged);
}

void MGraphicsView::resizeEvent(QResizeEvent *event)
{
    QGraphicsView::resizeEvent(event);
    thumb->updateImage();
    updateThumbRoi();
}

void MGraphicsView::scrollBarValueChanged()
{
    updateThumbRoi();
}

void MGraphicsView::updateThumbRoi()
{
    QScrollBar* hsb = horizontalScrollBar();
    PosInfo xinfo;
    xinfo.min = hsb->minimum();
    xinfo.max = hsb->maximum();
    xinfo.value = hsb->value();
    xinfo.page = hsb->pageStep();
    QScrollBar* vsb = verticalScrollBar();
    PosInfo yinfo;
    yinfo.min = vsb->minimum();
    yinfo.max = vsb->maximum();
    yinfo.value = vsb->value();
    yinfo.page = vsb->pageStep();
    thumb->updateRoi(xinfo, yinfo);
}

/////////////////////////////////////////////////////////////////////////////////////////

MGraphicsView::Thumb::Thumb(QWidget* parent) :
    QWidget(parent)
{
    setFixedSize(120, 120);
}

void MGraphicsView::Thumb::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setOpacity(0.8);
    painter.fillRect(QRect(0, 0, width(), height()), QColor(255, 192, 32));
    int xoff = (width() - background.width()) / 2;
    int yoff = (height() - background.height()) / 2;
    painter.drawPixmap(xoff, yoff, background);

    /* 绘制ROI */
    painter.setPen(QColor(32, 32, 32));
    painter.setBrush(Qt::NoBrush);
    painter.drawRect(roi.adjusted(xoff, yoff, xoff, yoff));
}

void MGraphicsView::Thumb::updateImage()
{
    QGraphicsView* view = dynamic_cast<QGraphicsView*>(parent());
    QRectF rect = view->sceneRect();
    qreal ratio = qMin(width() / rect.width(), height() / rect.height());
    background = QPixmap(rect.width() * ratio, rect.height() * ratio);
    QPainter painter(&background);
    QGraphicsScene* sc = view->scene();
    sc->render(&painter);
    update();
}

void MGraphicsView::Thumb::updateRoi(const PosInfo& xinfo, const PosInfo& yinfo)
{
    int w = background.width();
    int xwhole = ((xinfo.max - xinfo.min) + xinfo.page);
    int roiLeft = w * xinfo.value / xwhole;
    int roiWidth = w * xinfo.page / xwhole;
    int h = background.height();
    int ywhole = ((yinfo.max - yinfo.min) + yinfo.page);
    int roiTop = h * yinfo.value / ywhole;
    int roiHeight = h * yinfo.page / ywhole;
    roi = QRect(roiLeft, roiTop, roiWidth, roiHeight);
    update();
}

 

标签:QGraphicsView,MGraphicsView,Qt,缩略图,int,xinfo,void,yinfo,Thumb
From: https://www.cnblogs.com/mengxiangdu/p/16923018.html

相关文章

  • 小程序 XQTypeScriptFramework 使用
    说明XQTypeScriptFramework隶属于XQFramework下JS基础性框架部分XQFramework励志将开发将常用开发语言基础性框架统一汇总,为全站开发使用到的基础语法进行统一,拜......
  • ImageMagic实现centerCrop转化缩略图效果
    ImageMagic实现centerCrop转化缩略图效果,方法如下:exec("convert$rawPath-gravitycenter-crop160x160+0+0$compressPath");//生成缩略图原图:结果图:......
  • 初学银河麒麟linux笔记 第五章 windows中开发的QT程序适配linux的修改——外部控件重
    本人在WINDOWS系统中使用了“飞扬青云”的控件https://gitee.com/feiyangqingyun/QUCSDK由于系统移植,调用库应改为linux系统,首先下载对应版本的库,我windows上使用的是QT.......
  • Qt QList结构体排序
    1.应用场景在实际项目中,需要比对结果按照相似度排序;可以直接用qSort去比对,采用lamla表达式作为比较函数;//是一个QMap对象的List QVariantList m_PicComapreQueue.appe......
  • qt4 webkit 编译
    qt4webkit编译2021-05-1415:29:44最近编译出了Qt4.7.4的嵌入式版本,但没有编译QtWebkit库。在编译一个使用Webkit的工程时出错,而根据工程的需要,要单独编译QtWebki......
  • 自定义的Qt搜索框控件
    该控件模仿的是比较常见的应用程序中的搜索框。实现了输入文本后按回车搜索(也可以点击搜索按钮开始搜索),和记住最近的几个搜索记录的功能。使用者通过响应inputCompleted信......
  • QT图片查看器封装-鼠标中心缩放、移动、截图、框选、切换播放
    Qt图片查看器目录1      简介...12      功能实现...22.1     图片以鼠标为中心放大缩小功能...22.2     图片移动功能...42.3   ......
  • Qt5 CMake项目简单模板
    cmake_minimum_required(VERSION3.5)project(testVERSION0.1LANGUAGESCXX)set(CMAKE_INCLUDE_CURRENT_DIRON)set(CMAKE_CXX_STANDARD11)set(CMAKE_CXX_STAN......
  • QT-Qt Creator项目概述(四)
    前置知识C++程序执行过程:预处理:对源程序进行宏代替,条件编译,头文件展开,去除注释;编译:词法分析、语法分析,语义分析以及优化后产生汇编代码文件;(编译器)汇编:将汇编代码翻译成......
  • Qt中的.pro文件
    .pro就是工程文件(project),它是qmake自动生成的用于生产makefile的配置文件。.pro文件的写法如下:注释从“#”开始,到这一行结束。模板变量告诉qmake为这个应用程序生成哪种ma......