QT源码拾贝0-5(qimage和qpainter)

news2025/1/12 19:40:33

目录

0   qt源码查看方法

1.  qimage.cpp中线程池使用方法

2.  qpainter_p.h中SmallStack模板元结构体存放智能指针

3.  qpainter.cpp的保存函数,状态对象赋值使用std::exchange函数

4.  qpainter.cpp中获得类对象的方法

5.  qpainter.cpp中QChar字节操作,使用u在字节前面



0   qt源码查看方法

使用vscode工具,加载qt源码路径,比如:C:\Qt\6.5.0\Src

再按住ctrl+鼠标,可以方便查看引用函数的定义。

返回上次光标位置,使用快捷键Alt和方向左/右键

跳过单个变量,使用快捷键ctrl加方向左/右键

1.  qimage.cpp中线程池使用方法


/*!
    \since 5.14

    Applies the color transformation \a transform to all pixels in the image.
*/
void QImage::applyColorTransform(const QColorTransform &transform)
{
    if (transform.isIdentity())
        return;
    detach();
    if (!d)
        return;
    if (pixelFormat().colorModel() == QPixelFormat::Indexed) {
        for (int i = 0; i < d->colortable.size(); ++i)
            d->colortable[i] = transform.map(d->colortable[i]);
        return;
    }
    QImage::Format oldFormat = format();
    if (qt_fpColorPrecision(oldFormat)) {
        if (oldFormat != QImage::Format_RGBX32FPx4 && oldFormat != QImage::Format_RGBA32FPx4
                && oldFormat != QImage::Format_RGBA32FPx4_Premultiplied)
            convertTo(QImage::Format_RGBA32FPx4);
    } else if (depth() > 32) {
        if (oldFormat != QImage::Format_RGBX64 && oldFormat != QImage::Format_RGBA64
                && oldFormat != QImage::Format_RGBA64_Premultiplied)
            convertTo(QImage::Format_RGBA64);
    } else if (oldFormat != QImage::Format_ARGB32 && oldFormat != QImage::Format_RGB32
                && oldFormat != QImage::Format_ARGB32_Premultiplied) {
        if (hasAlphaChannel())
            convertTo(QImage::Format_ARGB32);
        else
            convertTo(QImage::Format_RGB32);
    }

    QColorTransformPrivate::TransformFlags flags = QColorTransformPrivate::Unpremultiplied;
    switch (format()) {
    case Format_ARGB32_Premultiplied:
    case Format_RGBA64_Premultiplied:
    case Format_RGBA32FPx4_Premultiplied:
        flags = QColorTransformPrivate::Premultiplied;
        break;
    case Format_RGB32:
    case Format_RGBX64:
    case Format_RGBX32FPx4:
        flags = QColorTransformPrivate::InputOpaque;
        break;
    case Format_ARGB32:
    case Format_RGBA64:
    case Format_RGBA32FPx4:
        break;
    default:
        Q_UNREACHABLE();
    }

    std::function<void(int,int)> transformSegment;

    if (qt_fpColorPrecision(format())) {
        transformSegment = [&](int yStart, int yEnd) {
            for (int y = yStart; y < yEnd; ++y) {
                QRgbaFloat32 *scanline = reinterpret_cast<QRgbaFloat32 *>(d->data + y * d->bytes_per_line);
                QColorTransformPrivate::get(transform)->apply(scanline, scanline, width(), flags);
            }
        };
    } else  if (depth() > 32) {
        transformSegment = [&](int yStart, int yEnd) {
            for (int y = yStart; y < yEnd; ++y) {
                QRgba64 *scanline = reinterpret_cast<QRgba64 *>(d->data + y * d->bytes_per_line);
                QColorTransformPrivate::get(transform)->apply(scanline, scanline, width(), flags);
            }
        };
    } else {
        transformSegment = [&](int yStart, int yEnd) {
            for (int y = yStart; y < yEnd; ++y) {
                QRgb *scanline = reinterpret_cast<QRgb *>(d->data + y * d->bytes_per_line);
                QColorTransformPrivate::get(transform)->apply(scanline, scanline, width(), flags);
            }
        };
    }

#if QT_CONFIG(thread) && !defined(Q_OS_WASM)
    int segments = (qsizetype(width()) * height()) >> 16;
    segments = std::min(segments, height());
    QThreadPool *threadPool = QThreadPool::globalInstance();
    if (segments > 1 && threadPool && !threadPool->contains(QThread::currentThread())) {
        QSemaphore semaphore;
        int y = 0;
        for (int i = 0; i < segments; ++i) {
            int yn = (height() - y) / (segments - i);
            threadPool->start([&, y, yn]() {
                transformSegment(y, y + yn);
                semaphore.release(1);
            });
            y += yn;
        }
        semaphore.acquire(segments);
    } else
#endif
        transformSegment(0, height());

    if (oldFormat != format())
        *this = std::move(*this).convertToFormat(oldFormat);
}

2.  qpainter_p.h中SmallStack模板元结构体存放智能指针


    std::unique_ptr<QPainterState> state;
    template <typename T, std::size_t N = 8>
    struct SmallStack : std::stack<T, QVarLengthArray<T, N>> {
        void clear() { this->c.clear(); }
    };
    SmallStack<std::unique_ptr<QPainterState>> savedStates;

    mutable std::unique_ptr<QPainterDummyState> dummyState;

3.  qpainter.cpp的保存函数,状态对象赋值使用std::exchange函数

void QPainter::save()
{
#ifdef QT_DEBUG_DRAW
    if (qt_show_painter_debug_output)
        printf("QPainter::save()\n");
#endif
    Q_D(QPainter);
    if (!d->engine) {
        qWarning("QPainter::save: Painter not active");
        return;
    }

    std::unique_ptr<QPainterState> prev;
    if (d->extended) {
        // separate the creation of a new state from the update of d->state, since some
        // engines access d->state directly (not via createState()'s argument)
        std::unique_ptr<QPainterState> next(d->extended->createState(d->state.get()));
        prev = std::exchange(d->state, std::move(next));
        d->extended->setState(d->state.get());
    } else {
        d->updateState(d->state);
        prev = std::exchange(d->state, std::make_unique<QPainterState>(d->state.get()));
        d->engine->state = d->state.get();
    }
    d->savedStates.push(std::move(prev));
}

4.  qpainter.cpp中获得类对象的方法


QBrush QPaintEngineState::brush() const
{
    return static_cast<const QPainterState *>(this)->brush;
}

5.  qpainter.cpp中QChar字节操作,使用u在字节前面

int old_offset = offset;
    for (; offset < text.size(); offset++) {
        QChar chr = text.at(offset);
        if (chr == u'\r' || (singleline && chr == u'\n')) {
            text[offset] = u' ';
        } else if (chr == u'\n') {
            text[offset] = QChar::LineSeparator;
        } else if (chr == u'&') {
            ++maxUnderlines;
        } else if (chr == u'\t') {
            if (!expandtabs) {
                text[offset] = u' ';
            } else if (!tabarraylen && !tabstops) {
                tabstops = qRound(fm.horizontalAdvance(u'x')*8);
            }
        } else if (chr == u'\x9c') {
            // string with multiple length variants
            hasMoreLengthVariants = true;
            break;
        }
    }

    QList<QTextLayout::FormatRange> underlineFormats;
    int length = offset - old_offset;
    if ((hidemnmemonic || showmnemonic) && maxUnderlines > 0) {
        QChar *cout = text.data() + old_offset;
        QChar *cout0 = cout;
        QChar *cin = cout;
        int l = length;
        while (l) {
            if (*cin == u'&') {
                ++cin;
                --length;
                --l;
                if (!l)
                    break;
                if (*cin != u'&' && !hidemnmemonic && !(tf & Qt::TextDontPrint)) {
                    QTextLayout::FormatRange range;
                    range.start = cout - cout0;
                    range.length = 1;
                    range.format.setFontUnderline(true);
                    underlineFormats.append(range);
                }
#ifdef Q_OS_MAC
            } else if (hidemnmemonic && *cin == u'(' && l >= 4 &&
                       cin[1] == u'&' && cin[2] != u'&' &&
                       cin[3] == u')') {
                int n = 0;
                while ((cout - n) > cout0 && (cout - n - 1)->isSpace())
                    ++n;
                cout -= n;
                cin += 4;
                length -= n + 4;
                l -= 4;
                continue;
#endif //Q_OS_MAC
            }
            *cout = *cin;
            ++cout;
            ++cin;
            --l;
        }
    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录算法训练营三期 day 22 - 二叉树(8)

235. 二叉搜索树的最近公共祖先 原文链接&#xff1a;235. 二叉搜索树的最近公共祖先 题目链接&#xff1a;235. 二叉搜索树的最近公共祖先 在 有序树 里: 从上向下递归遍历&#xff0c;第一次遇到 curcurcur 结点的数值在 p,qp, qp,q 结点对应数值的闭区间中&#xff0c;那么…

内网渗透神器CobaltStrike之Beacon详解(三)

Beacon的种类 HTTP Beacon和HTTPS Beacon 这两个beacon的原理是通过发送http请求与受害主机通信来传达命令, 以此实现控制效果 优点是传输数据快, 缺点时隐蔽性差, 容易被防火墙或内网审计工具拦截 TCP Beacon 自CS4.0版本之后只有反向的TCP Beacon可用, 基于TCP协议的通信…

取证初级案例操作大纲

文章目录**取证初级案例操作大纲**1) 证据文件中有没有存在被删除的Doc文档&#xff1f;如果有的话&#xff0c;请导出并记录文件名及路径&#xff1a;2) 证据文件中有没有存在被删除的图片&#xff1f;如果有的话&#xff0c;请记录文件名及路径&#xff1a;3) 证据文件中哪几…

object类的一些方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 Object类 输出对象地址 object类里的tostring方法&#xff1a; 正确输出对象里内容 判断俩个对象大小&#xff1a; object类里的equlas方法&#xff1a; 自己实现一…

SpringCloud - 微服务理论基础

文章目录1.微服务架构1.1 什么是微服务1.2 Spring Cloud 简介1.3 Spring Cloud 技术栈2.Boot 和 Cloud 版本选型3.Cloud 服务升级1.微服务架构 1.1 什么是微服务 微服务架构是一种架构模式&#xff0c;它提倡单一应用程序划分成一组小的服务&#xff0c;服务直接相互协调、相互…

Python PyInstaller 打包成 Win、Mac 应用程序(app / exe)

一、简介 python 提供了几个用来打包的模块&#xff0c;主要有 py2app、py2exe、pyinstaller。附&#xff1a;pyinstaller、py2app、py2exe、fbs 对比与爬坑。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-whT6cPog-1668880648443)(https://p1-jue…

(续)SSM整合之springmvc笔记(RESTful之HiddenHttpMethodFilter源码解析)(P147)了解

RESTful之HiddenHttpMethodFilter源码解析 由于浏览器只支持发送get和post方式的请求&#xff0c;那么该如何发送put和delete请求呢&#xff1f; SpringMVC 提供了 HiddenHttpMethodFilter 帮助我们将POST 请求转换为DELETE 或PUT 请求 HiddenHttpMethodFilter 处理put和delete…

java计算机毕业设计ssm陕理工图书馆管理系统

项目介绍 随着互联网技术的发发展,计算机技术广泛应用在人们的生活中,逐渐成为日常工作、生活不可或缺的工具,高校各种管理系统层出不穷。高校作为学习知识和技术的高等学府,信息技术更加的成熟,为高校图书馆借阅开发必要的系统,能够有效的提升管理效率。一直以来,高校图书馆一…

Docker搭建Redis集群

Docker搭建Redis集群 注意&#xff1a;Redis搭建集群最少需要6个Redis节点&#xff0c;其中3个作为主节点&#xff0c;3个作为从节点&#xff1b; 为了方便&#xff0c;这里用Docker在一台机器上启动6个容器来作为集群&#xff0c;生产上建议用多台服务器搭建&#xff1b; 创建…

4.1.3 名称的特殊处理

名称的特殊处理 类成员变量的名称处理&#xff1a; 对于类的数据成员&#xff0c;其的名称经过编译器的处理会在程序员定义名称的后面再加上class的名称&#xff0c;进而形成独一无二的命名&#xff0c;例如下面的的成员变量x再经过类处理后有可能为x_7Point3d。 class Point…

Linux之手把手教你捋清楚make和makefile

文章目录背景简单介绍make和makefile依赖关系和依赖方法项目清理以及伪目标背景 以往的C语言编程&#xff0c;我们一般都在一些像VS2019这样的集成开发环境(IDE)下编写&#xff0c;一个工程中的源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0…

Spring框架的概述及基本应用

Spring的基本应用 文章目录Spring的基本应用1. Spring 概述1.1 什么是Spring1.2 Spring 框架的优点1.3 Spring的体系结构2. Spring的核心容器2.1 BeanFactory2.2 ApplicationContext3. Spring的入门程序3.1 在pom下利用maven导入Spring所需要的jar包3.2 简单搭建起demo结构3.3 …

Java中数组的定义与使用(Java系列3)

目录 前言&#xff1a; 1.什么是数组 2.数组的创建 3.数组的初始化 4.数组的使用 5.数组是引用类型 6.基本类型变量与引用类型变量的区别 7.数组的应用 8.二维数组 结束语&#xff1a; 前言&#xff1a; 前面小编与大家分享了C语言与Java中的区别&#xff0c;还有一…

leaflet教程041: Point 和 LatLng 坐标互相转换

第041个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中使用Point和LatLng,这里做了两者之间的转换。 注意 两者转换后的值,返回相对于原点像素的相应像素坐标或经纬度坐标。zoom改变,原点(地图图层左上角的投影像素坐标)的值会改变,所以获得的值也会变化。…

51单片机学习笔记1 简介及开发环境

51单片机学习笔记1 简介及开发环境一、51单片机1. STC89C52单片机简介2. 命名规则3. 封装&#xff08;1&#xff09;PDIP&#xff08;2&#xff09;LQFP&#xff08;3&#xff09;PLCC&#xff08;4&#xff09;PQFP二、STC8051结构1. STC 8051 内部结构图2. 内部结构框图3. 单…

Android设置TabLayout熟悉及下划线宽度

Tablayout的使用 属性 app&#xff1a;tabMod 设置Tab模式 app&#xff1a;tabTextColor 设置文本颜色 app&#xff1a;tabSelectedTextColor 设置选中文本颜色 app:tabIndicatorColor 设置下滑条颜色 app:tabMaxWidth“xxdp” 设置最大的tab宽度 app:tabMinWidth“xxdp” 设置…

牛客网之SQL100题(7)-字符串截取、切割、删除、替换

知识点&#xff1a; &#xff08;1&#xff09;substring_indexsubstring_index(str,delim,count) str:要处理的字符串 delim:分隔符 count:计数 &#xff08;2&#xff09;切割、截取、删除、替换 1 2 3 4 5 6 7 8 9 10 11 12 13 14 select -- 替换法 replace(string, 被…

类型转换C11

类型转换 C类型转换分为显式类型转换和隐式类型转换 &#xff0c;隐式类型转换由编译器自动完成&#xff0c;这里只讨论显式类型转换。 旧式风格的类型转换 type(expr); // 函数形式的强制类型转换 (type)expr; // C语言风格的强制类型转换现代C风格的类型转换 cast-name&l…

1-2 VMware安装Rocky9.0和Ubuntu22.04系统

文章目录前言下载链接VMware使用安装Rocky9.0系统Rocky初始化安装Ubuntu22.04系统Ubuntu初始化VMware快照前言 VMware虚拟机软件是一个“虚拟PC”软件&#xff0c;它使你可以在一台机器上同时运行二个或更多Windows、DOS、LINUX系统。 Rocky Linux 9.0 操作系统与2022年7月14…

基于matlab GUI的数字图像处理系统

目 录 摘 要 I Abstract II 第1章 绪论 1 1.1选题背景及意义 1 1.2国内外研究现状 2 1.2.1国内研究现状 2 1.2.2国外研究现状 3 1.3研究主要内容 3 第2章 数字图像处理系统设计 5 2.1设计概括 5 2.2文件 6 2.2.1打开 6 2.2.2保存 6 2.2.3退出 6 2.3图像变形 7 2.3.1图像缩放 7 …