画家-qt-surce

void GraphicView::paintEvent(QPaintEvent *pe)
{
    QPainter painter(viewport());
    painter.setRenderHint(QPainter::SmoothPixmapTransform);//升级画家
    painter.drawImage(rect(),musicImage);
 
 
}
分析:

这段代码是用于绘制图形视图的部分。

1. `void GraphicView::paintEvent(QPaintEvent *pe)`: 这是一个事件处理函数,当图形视图需要被绘制时被调用。它接收一个指向QPaintEvent对象的指针作为参数。

2. `QPainter painter(viewport());`: 这里创建了一个QPainter对象,用于执行绘图操作。`viewport()` 返回图形视图的视口,即可视区域的矩形。

3. `painter.setRenderHint(QPainter::SmoothPixmapTransform);`: 这一行设置了绘图选项,指定了平滑的像素转换。这个选项可以使得图像变换更加平滑,尤其是在缩放时。这是一个优化绘图质量的设置。

4. `painter.drawImage(rect(),musicImage);`: 这一行使用`drawImage()`函数在视口上绘制图像。`rect()`返回图形视图的矩形区域,`musicImage`是要绘制的图像对象。

总体而言,这段代码在图形视图的绘制事件中使用了一个QPainter对象来绘制一个图像,同时通过设置渲染选项来提高绘图质量。


2.

class Q_GUI_EXPORT QResizeEvent : public QEvent
{
public:
    QResizeEvent(const QSize &size, const QSize &oldSize);
    ~QResizeEvent();
 
    inline const QSize &size() const { return s; }
    inline const QSize &oldSize()const { return olds;}
protected:
    QSize s, olds;
    friend class QApplication;
};

这段代码定义了一个名为`QResizeEvent`的类,它是`QEvent`的一个子类,用于表示窗口大小调整事件。

1. `class Q_GUI_EXPORT QResizeEvent : public QEvent`: 这是一个类的定义,声明了一个名为`QResizeEvent`的类,它是`QEvent`的一个子类,用于表示窗口大小调整事件。`Q_GUI_EXPORT`是一个宏,用于指示该类应该被导出,通常在跨库边界使用。

2. `QResizeEvent(const QSize &size, const QSize &oldSize)`: 这是该类的构造函数,用于创建一个`QResizeEvent`对象。它接收两个参数:`size`和`oldSize`,分别表示窗口的新大小和旧大小。

3. `~QResizeEvent()`: 这是析构函数,用于释放`QResizeEvent`对象的资源。

4. `inline const QSize &size() const { return s; }`: 这是一个内联函数,用于返回窗口的新大小。函数名为`size()`,返回类型为`const QSize &`,即一个常量引用。

5. `inline const QSize &oldSize() const { return olds; }`: 这是另一个内联函数,用于返回窗口的旧大小。函数名为`oldSize()`,返回类型也是`const QSize &`,即一个常量引用。

6. `protected: QSize s, olds;`: 这里声明了两个成员变量`QSize s`和`QSize olds`,分别表示窗口的新大小和旧大小。它们被声明为`protected`,表示它们只能被该类及其子类访问。

7. `friend class QApplication;`: 这是一个友元声明,将`QApplication`类声明为`QResizeEvent`的友元类,使得`QApplication`类可以访问`QResizeEvent`的私有成员。

综上所述,这段代码定义了一个用于表示窗口大小调整事件的`QResizeEvent`类,其中包含了窗口的新大小和旧大小,并提供了方法来获取这些大小信息。


test 4;
void GraphicView::resizeEvent(QResizeEvent *re)
{
    int w =re->size().width();
    int h =re->size().height();
scene->setSceneRect(w/-2.0,h/-2.0,w,h);
}

这段代码定义了一个名为`resizeEvent`的成员函数,该函数用于处理窗口大小调整事件。

1. `void GraphicView::resizeEvent(QResizeEvent *re)`: 这是一个重写的成员函数,用于处理窗口大小调整事件。它接收一个指向`QResizeEvent`对象的指针`re`作为参数。

2. `int w = re->size().width();`: 这行代码获取窗口调整后的宽度,并将其存储在变量`w`中。`re->size()`返回一个`QSize`对象,然后使用`width()`方法获取宽度。

3. `int h = re->size().height();`: 这行代码获取窗口调整后的高度,并将其存储在变量`h`中。同样地,`re->size()`返回一个`QSize`对象,然后使用`height()`方法获取高度。

4. `scene->setSceneRect(w/-2.0, h/-2.0, w, h);`: 这行代码设置场景的矩形区域。`setSceneRect`方法用于设置场景的矩形边界。这里的边界是基于窗口的新大小计算的,它是以窗口中心为基准的,宽度和高度都是窗口大小的一半。

   - `w/-2.0`和`h/-2.0`:这是场景矩形的左上角坐标,将窗口宽度和高度的一半取反作为偏移量,以使场景矩形以窗口中心为中心。
   - `w`和`h`:这是场景矩形的宽度和高度,与窗口的新大小相匹配。

综上所述,这段代码在窗口大小调整时更新场景的矩形边界,以确保场景适应新的窗口大小,并使其以窗口中心为中心。


trse5
void PloverMusic::slotShowPic(QByteArray ImageData)
{
    QImage musicImage = QImage::fromData(ImageData);
    ui->graphicsView->setImage(musicImage);
}

这段代码定义了一个名为 `slotShowPic` 的槽函数,用于显示音乐图片。

1. `void PloverMusic::slotShowPic(QByteArray ImageData)`: 这是一个槽函数的定义,声明了一个名为 `slotShowPic` 的函数,接收一个 `QByteArray` 类型的参数 `ImageData`。该函数是 `PloverMusic` 类的成员函数。

2. `QImage musicImage = QImage::fromData(ImageData);`: 这行代码创建了一个 `QImage` 对象 `musicImage`,并使用 `QImage::fromData()` 静态函数从给定的二进制图像数据 `ImageData` 中创建了图像。这个函数会根据数据内容来确定图像格式,并将其加载为 `QImage` 对象。

3. `ui->graphicsView->setImage(musicImage);`: 这行代码调用了 `graphicsView` 对象的 `setImage` 方法,并将之前创建的 `musicImage` 图像设置为参数。`graphicsView` 是一个指向 `QGraphicsView` 对象的指针,通过 `ui` 对象可以访问到用户界面中的元素。

综上所述,这段代码的作用是接收音乐图片的二进制数据,将其转换为 `QImage` 对象,并将该图像显示在名为 `graphicsView` 的 `QGraphicsView` 对象中。


特首test6
QImage GraphicView::makeArgb32Img(QImage musicImg)
{
    //等比缩小专辑图片,大小与圆形图片一样大,格式变成Argb32
    QImage circleMask(":/Image/circleMask.png");//获取大小
    musicImg = musicImg.scaled(circleMask.size(), Qt::KeepAspectRatio);
   //
    QImage fixedImage(circleMask.size(), QImage::Format_ARGB32_Premultiplied);//
        QPainter painter(&fixedImage);
 
}

这段代码定义了一个名为 `makeArgb32Img` 的成员函数,用于将输入的音乐图片转换为 ARGB32 格式的图像,并且进行等比缩小以与圆形图片大小相匹配。

```cpp
QImage GraphicView::makeArgb32Img(QImage musicImg)
{
    // 等比缩小专辑图片,大小与圆形图片一样大,格式变成 ARGB32
    QImage circleMask(":/Image/circleMask.png"); // 获取大小
    musicImg = musicImg.scaled(circleMask.size(), Qt::KeepAspectRatio);
```

1. `QImage circleMask(":/Image/circleMask.png");`:
   - 这行代码从项目资源中加载一个名为 `circleMask.png` 的圆形图片,用于获取其大小。
   - 这个圆形图片将用于作为参考,让专辑图片进行等比缩小,确保它们大小相同。

2. `musicImg = musicImg.scaled(circleMask.size(), Qt::KeepAspectRatio);`:
   - 这行代码将输入的专辑图片 `musicImg` 进行等比缩小,使其大小与 `circleMask` 图片的大小相同。
   - `scaled()` 方法是 `QImage` 类的函数,用于对图像进行缩放。`Qt::KeepAspectRatio` 参数确保缩放过程中保持图像的纵横比。

```cpp
    QImage fixedImage(circleMask.size(), QImage::Format_ARGB32_Premultiplied);
    QPainter painter(&fixedImage);
}
```

3. `QImage fixedImage(circleMask.size(), QImage::Format_ARGB32_Premultiplied);`:
   - 这行代码创建了一个新的 `QImage` 对象 `fixedImage`,其大小与 `circleMask` 图片相同,格式为 ARGB32。
   - ARGB32 是一种图像格式,其中每个像素由一个 alpha 值和三个颜色分量(红、绿、蓝)组成,以支持透明度。

4. `QPainter painter(&fixedImage);`:
   - 这行代码创建了一个 `QPainter` 对象 `painter`,它用于在 `fixedImage` 上绘制图形。
   - `QPainter` 类提供了一种方便的方法来在 `QImage` 或其他设备上绘制各种形状和文本。

整个函数的目的是将输入的专辑图片转换为 ARGB32 格式的图像,并将其缩放为与圆形图片大小相同,以便后续的处理或显示。接下来可能会在 `painter` 对象上进行绘制操作,但在代码中这部分似乎尚未实现。


在对QImage对象进行组合(通过QPainter类的setCompositionMode函数设置组合模式)、混合操作时,应优先使用QImage::Format_ARGB32_Premultiplied格式,因为该格式进行了预乘处理,所以在图像组合和混合时,效率要高些。


特赦ttest7
QImage GraphicView::makeArgb32Img(QImage musicImg)
{
    //等比缩小专辑图片,大小与圆形图片一样大,格式变成Argb32
    QImage circleMask(":/Image/circleMask.png");//获取大小
    musicImg = musicImg.scaled(circleMask.size(), Qt::KeepAspectRatio);
   //
    QImage fixedImage(circleMask.size(), QImage::Format_ARGB32_Premultiplied);//
        QPainter painter(&fixedImage);
        //双线性插值算法 提高图片像素
        painter.setRenderHint(QPainter::SmoothPixmapTransform);
        painter.setCompositionMode(QPainter::CompositionMode_Source);
painter.fillRect(fixedImage.rect(), Qt::transparent);
painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
 painter.drawImage(fixedImage.rect(), musicImg);//ky wen
 painter.end();
 
  return fixedImage;
}

难点:

  painter.setCompositionMode(QPainter::CompositionMode_Source);
painter.fillRect(fixedImage.rect(), Qt::transparent);
painter.setCompositionMode(QPainter::CompositionMode_SourceOver);


这三行代码涉及了 `QPainter` 对象的混合(composition)模式设置,用于在 `fixedImage` 上进行图像绘制和合成操作。让我们逐行解释这些代码:

1. `painter.setCompositionMode(QPainter::CompositionMode_Source);`:
   - 这行代码设置了 `QPainter` 的混合模式为 `CompositionMode_Source`。
   - 在这个模式下,绘制操作将直接用新的像素值覆盖目标图像,而不考虑目标图像原有的内容。这意味着后续的绘制操作将直接替换 `fixedImage` 中对应位置的像素值,而不会与原有内容进行混合。

2. `painter.fillRect(fixedImage.rect(), Qt::transparent);`:
   - 这行代码用透明色填充了 `fixedImage` 的整个矩形区域。
   - 这是为了确保目标图像 `fixedImage` 的背景是透明的,这样后续的图像绘制操作不会受到原有内容的影响,而是以透明背景作为基准进行绘制。

3. `painter.setCompositionMode(QPainter::CompositionMode_SourceOver);`:
   - 这行代码设置了 `QPainter` 的混合模式为 `CompositionMode_SourceOver`。
   - 在这个模式下,新的像素值将按照它们的 alpha 值进行混合叠加到目标图像上。这意味着后续的图像绘制操作将以透明的背景为基础,在不影响目标图像中原有内容的情况下,将新的像素值绘制在上面。

综合起来,这些混合模式的设置确保了在 `fixedImage` 上进行图像绘制时的正确叠加和合成效果:首先设置直接覆盖模式,以确保后续的填充操作完全替换目标图像;然后用透明色填充背景,为后续的图像绘制提供透明基准;最后设置混合模式为覆盖模式,以正确叠加新的像素值到目标图像上,同时保留原有内容。


source  是 透明的 混合 :

CompositionMode_SourceOver  和CompositionMode_Source的区别

QPainter类的CompositionMode各值含义_setcompositionmode-CSDN博客

test8
painter.drawImage(QPointF((diskImg.width()-circleImg.width())/2,(diskImg.height()-circleImg.height())/2),circleImg);
    painter.end();

这两行代码看起来像是在一个 `QPainter` 对象上进行绘制操作,让我详细解释一下:

1. `painter.drawImage(QPointF((diskImg.width()-circleImg.width())/2,(diskImg.height()-circleImg.height())/2), circleImg);`:
   - 这行代码使用 `drawImage` 函数在 `painter` 上绘制图像。
   - `QPointF((diskImg.width()-circleImg.width())/2, (diskImg.height()-circleImg.height())/2)` 是目标位置的左上角坐标。这个坐标通过计算,将圆形图片 (`circleImg`) 放置在目标图像 (`diskImg`) 的中心位置。
   - `circleImg` 是要绘制的圆形图片。

2. `painter.end();`:
   - 这行代码结束了对 `painter` 的绘制操作,释放资源。

综合起来,这段代码的作用是在目标图像 `diskImg` 上绘制圆形图片 `circleImg`,并将其放置在目标图像的中心位置。


 经验教训

当我没有 审计的  时候 ,就报 这个错误:

void GraphicView::setImage(const QImage &image)
{
    musicImage =image;
    QImage argbImg =makeArgb32Img(musicImage);
     argbImg.save("2.png");
   argbImg= makeCircleImg(argbImg);
    argbImg.save("3.png");
 argbImg=  makeDiskImg(argbImg);
  argbImg.save("4.png");
update();
}

2.png---rgb 的图

为什么要转成rgb32的图

在Qt中,将图像转换为RGB32格式通常是为了在图像处理和显示过程中获得更好的性能和兼容性。这种格式具有以下几个优点:

1. **色彩深度和通道数:** RGB32格式使用32位表示每个像素,其中包括8位红色通道、8位绿色通道、8位蓝色通道以及8位Alpha通道(透明度)。这种高色彩深度和通道数使得图像能够准确地呈现各种色彩和透明效果。

2. **兼容性:** RGB32格式是一种常见的图像格式,被许多图像处理和显示库所支持,包括Qt自身的图像处理功能。因此,将图像转换为RGB32格式可以提高图像在不同平台和应用中的兼容性。

3. **性能优化:** 在某些情况下,RGB32格式的图像处理速度比其他格式更快。这是因为它的数据结构在内存中的排列方式通常更符合现代计算机处理器的工作方式,能够更有效地进行图像操作和渲染。

4. **透明度支持:** RGB32格式中的Alpha通道允许图像具有透明度信息,这对于需要处理半透明效果或者叠加多个图层的图像处理场景非常有用。

因此,将图像转换为RGB32格式可以提高图像处理的灵活性、性能和兼容性,使得在Qt中进行图像操作和显示更加方便和高效。

235*235

3.png---圆形图

4.png---光盘

=======


test9:

GraphicView::GraphicView(QWidget *parent) : QGraphicsView(parent),
     scene(new QGraphicsScene(this))
{
    musicImage.load(":/Image/logo0.png");
    setScene(scene);
 
}

这段代码定义了一个名为 `GraphicView` 的类的构造函数。这个类继承自 `QGraphicsView` 类,表示一个用于显示图形场景的视图控件。

1. `GraphicView::GraphicView(QWidget *parent) : QGraphicsView(parent),`:
   - 这是 `GraphicView` 类的构造函数的定义,它接受一个 `QWidget` 类型的指针 `parent` 作为参数。
   - 在构造函数的初始化列表中,调用了基类 `QGraphicsView` 的构造函数,并将 `parent` 作为参数传递进去,以便在构造时进行基类的初始化。

2. `scene(new QGraphicsScene(this))`:
   - 在构造函数的主体中,创建了一个新的 `QGraphicsScene` 对象,并使用 `this` 指针作为父对象,以确保在 `GraphicView` 被销毁时能够正确释放 `scene` 对象的内存。
   - 这个 `scene` 对象将用于管理和展示图形项(`QGraphicsItem`)。

3. `musicImage.load(":/Image/logo0.png");`:
   - 这一行代码加载了一个图片文件 `logo0.png`,并将其内容存储在 `musicImage` 对象中。
   - 图片文件的路径使用了 Qt 的资源系统中的路径表示方法 `:/`,表示资源文件夹中的文件。

4. `setScene(scene);`:
   - 这一行代码将之前创建的 `scene` 对象设置为当前视图的场景(scene)。
   - 这样,视图就可以在其区域内显示 `scene` 中的图形项了。

总的来说,这段代码的作用是在 `GraphicView` 类的构造函数中创建了一个 `QGraphicsScene` 对象,并将其设置为当前视图的场景,同时加载了一个图片文件并将其显示在视图中。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/572133.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Hbase中二级索引与Phoenix二级索引实现

1、引入 HBase本身只提供基于行键和全表扫描的查询,而行键索引单一,对于多维度的查询困难。 所以我们引进一个二级索引的概念。二级索引的本质就是建立各列值与行键之间的映射关系 。 图解: 2、常见实现二级索引的方案: HBase…

go版本1.16.5 运行项目出现undefined: math.MaxInt报错

问题描述 go版本 go1.16.5 项目引用了 包go-sqlite3 v1.14.17 github.com/mattn/go-sqlite3 v1.14.17运行报错 # github.com/mattn/go-sqlite3 D:\GoPATH\pkg\mod\github.com\mattn\go-sqlite3v1.14.17\sqlite3_opt_serialize.go:41:26: undefined: math.MaxInt原因分析&…

离散数学之一阶逻辑基本概念与等值演算思维导图+大纲笔记(期末复习,考研,学习笔记,知识点总结)

大纲笔记 基本概念 一阶逻辑命题符号化 个体词 个体常项 个体变项 个体域 个体总域 谓词 谓词常项 谓词变项 零元谓词 特性谓词 引入规则 量词 全称量词 存在量词 一阶逻辑1公式及解释 基本概念 原子公式 谓词公式 自由变元与约束变元 自由变元 换名规则 约束变元 带入规则 闭…

强制内容在一行显示

强制内容在一行显示 .one {white-space: nowrap;overflow: hidden;text-overflow: ellipsis; /* 可选,当内容超出一行时,用省略号表示 */ }效果

构建代理IP池并自动测试可用性的爬虫实现

目录 前言 一、认识代理IP 1. 隐藏真实IP地址 2. 提高爬虫效率 二、爬取代理IP 三、测试代理IP可用性 1. 发起HTTP请求 2. 超时检测 3. 循环请求 四、构建代理IP池 五、总结 前言 随着互联网的发展,网络爬虫在数据采集、搜索引擎、信息监控等领域发挥着…

vue2和vue3浏览器兼容性对比

一、Vue2.0不支持IE8, 因为Vue使用了IE8无法模拟的ECMAScript 5 特性,但它支持所有兼容ECMAScript 5 的浏览器。 二、Vue3.0 不支持 IE11 及以下版本。兼容ECMAScript 5的浏览器

铝基碳化硅复合材料(AlSiC)可用于制造火星车 行业发展前景较好

铝基碳化硅复合材料(AlSiC)可用于制造火星车 行业发展前景较好 铝基碳化硅复合材料(AlSiC)又称铝基碳化硅颗粒增强复合材料,指由铝和碳化硅复合而成的高性能材料。铝基碳化硅复合材料具有耐腐蚀、高温稳定性好、轻量化…

机器学习笔记(二)回归

一、线性回归 线性回归是一种用于预测的统计方法,特别适用于连续值预测。📈线性回归通过最小化误差的平方和来寻找一个线性关系,用于预测一个变量(因变量)基于一个或多个其他变量(自变量)的值。…

02 贪吃蛇

前言 呵呵 这是不知道 在哪里看到的 别人做的一个贪吃蛇 因此 也把我 之前的 贪吃蛇 移植上来了 当然 这个不过是为了 简单的入门了解, 呵呵 然后 c版本的贪吃蛇 需要先移植成 c 版本, 然后 再根据 单片机相关 设计调整 比如 led 点阵的输出, 比如 c99 语法的一些不兼容…

Power BI数据刷新 - 网关 数据源凭据详解

众所周知,如果在Power BI云服务中设置数据源自动刷新,有两种方式供你选择, 分别是: Gateway and cloud connections(网关和云连接);Data Source Credentials(数据源凭据)&#xff1…

分类算法——模型评估(八)

1混淆矩阵 在分类任务下,预测结果与正确标记之间存在四种不同的组合,构成混淆矩阵(适用于多分类) TP True Possitive FN False Negative 2精确率(Precision)与召回率(Recall) 精…

文献速递:肺癌早期诊断---利用低剂量CT扫描的三维概率深度学习系统用于肺癌的检测与诊

Title 题目 A 3D Probabilistic Deep Learning System forDetection and Diagnosis of Lung Cancer Using Low-Dose CT Scans 利用低剂量CT扫描的三维概率深度学习系统用于肺癌的检测与诊 01文献速递介绍 肺癌既是最常见的癌症之一,也是导致癌症死亡的主要原因之…

IDEA 全局查找 ctrl + shift + F 快捷键失效

全局查找:ctrl shift F 需要关闭微软输入法简体/繁体切换,不然被占用了无效 (装了搜狗输入法的同理,找一下是不是这个快捷键冲突了 ) 另外还有 IDEA 中 重构变量名 :shift F6 需要关闭微软输入法最新版本 ( 使用以前版本的微软输入法就没…

IPv4 NAT(含Cisco配置)

IPv4 NAT(含Cisco配置) IPv4私有空间地址 类RFC 1918 内部地址范围前缀A10.0.0.0 - 10.255.255.25510.0.0.0/8B172.16.0.0 - 172.31.255.255172.16.0.0/12C192.168.0.0 - 192.168.255.255192.168.0.0/16 这些私有地址可在企业或站点内使用&#xff0c…

【项目】仿muduo库One Thread One Loop式主从Reactor模型实现高并发服务器(TcpServer板块)

【项目】仿muduo库One Thread One Loop式主从Reactor模型实现⾼并发服务器(TcpServer板块) 一、思路图二、模式关系图三、定时器的设计1、Linux本身给我们的定时器2、我们自己实现的定时器(1)代码部分(2)思…

机器学习周记(第三十五周:语义分割)2024.4.15~2024.4.21

目录 摘要 ABSTRACT 1 语义分割基本概念 1.1 数据集格式 ​编辑 1.2 语义分割评价指标 1.3 语义分割标注工具 2 转置卷积 3 FCN网络结构基本原理 摘要 本周主要学习了语义分割的基本概念及其在计算机视觉领域中的应用。了解了语义分割的几种经典网络,如全卷…

绝地求生【商城更新】WIA联名上架//专属商店下架

大家好,我是闲游盒. 本周商城将在4.24(周三)更新,商城内容更新如下: 上架物品 ▲W.I.A联名皮肤大礼包 小礼包如下: 包含3套衣服以及MINI、DBS的联名皮肤,3个头饰还挺有特色的,你喜欢…

Edge浏览器下载文件提示 “无法安全下载” 的解决方法

提示如下: 虽然我们可以通过 "保留" 进行下载,但是每次需要选择,比较麻烦 解决方法: 1、打开注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft 2、创建2个 "项" Edge\InsecureContentAllowedForUrls…

目前主流的负载均衡器

客户端负载均衡器 Ribbon 客户端根据自己的请求进行负载均衡Ribbon就属于这一类 Ribbon可以帮助你在调用这些服务时进行负载均衡。具体来说,当你通过Ribbon进行服务调用时,它可以根据配置的负载均衡策略(如轮询、随机、最少并发数等&#xff…

机器学习笔记(一)基本概念

一、浅谈机器学习 1.1 机器学习简介 机器学习目的并不是为了得到最后的运算结果,而是对计算过程进行分析,总结出一套运算的规则。只要数据量足够多,运算规则就越准确。最后可以根据这套规则对没有通过验证的数据进行预算,得到预算…