• Qt中的Resource


    Qt资源系统(Qt Resource System)是一种将图片、数据存储在二进制文件中的一套系统。一般我们在程序中调用一张图片或者一个图标字体作为某个按钮的图标,如果替换成另一张同名的图片,那么程序运行时会加载新的图标。有这么一种情况,开发者不希望这些图标被修改或图标文件丢了程序界面也就不能正常显示。

    我们可以把这些图片存储在可执行文件中,即使删除了文件夹中的图标也不会影响界面图标的加载,因为图标数据已经以静态数据的方式保存在可执行文件中了。当然,代价就是编译出的可执行文件容量会增加,克服这个缺点的方法就是动态加载资源。

    创建qrc文件

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jPHdsRwf-1663406172989)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220917144010672.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qpzhvmzi-1663406172990)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220917144843198.png)]

    在新建文件中选择Qt Resource File,配置路径的时候最好在项目根目录下新建一个文件夹专门存放resource相关的文件。

    创建完成后,我们可以在项目中看到已经有了一个Resouces文件夹,注意这个文件夹是系统自动生成的,不是我们手动生成的。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TToCY2aQ-1663406172991)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220917145036675.png)]

    在Resources目录下有一个Resources\Resources.qrc文件,这个文件才是我们刚才新建的,并且在根目录下的Resources文件夹下。我们新建的Resources文件夹只是碰巧与项目中的Resources目录名称一样,当然,你也可以使用其他名称。

    加载资源

    我们创建了qrc文件后,可以检查pro文件,会发现多了一个句话:

    RESOURCES += \
        Resources/Resources.qrc
    
    • 1
    • 2

    这是一个静态加载方式,默认情况下就是这种方式,是直接将资源数据存储在可执行文件中。

    另外一种方式的动态加载方式,是将资源数据存储在单独的二进制文件中并由可执行文件调用。这种方式需要手动用rcc工具编译qrc文件,然后用QResource类加载,这里就不举例了。

    添加资源文件

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZCZ5G5al-1663406172991)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220917145952574.png)]

    进入资源编辑器后,首先需要添加一个前缀,这个东西其实就和目录差不多的,本质就是分组。如下图,我们已经分了3个组。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eVroxkm5-1663406172991)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220917151002932.png)]

    然后我们给每个组Add Files。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HTDxc17x-1663406172992)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220917151335867.png)]

    我们也可以使用普通文本编辑器打开qrc文件,发现其实就是xml文件。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vJs6Fmba-1663406172993)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220917151700297.png)]

    使用资源

    static void loadStyle(e)
    {
        QFile file(":/style/Style/blacksoft.css");
    
        if (file.open(QFile::ReadOnly)) {
            QString qss = QLatin1String(file.readAll());
            QString paletteColor = qss.mid(20, 7);
            qApp->setPalette(QPalette(paletteColor));
            qApp->setStyleSheet(qss);
            file.close();
        }
    }
    
    static void loadFont()
    {
        QFont iconFont;
        QFontDatabase fontDb;
        if(fontDb.hasFamily("FontAwesome"))
        {
            iconFont=QFont("FontAwesome");
        }
        else
        {
            int fontId = fontDb.addApplicationFont(":/font/Font/fontawesome-webfont.ttf");
                    QStringList fontName = fontDb.applicationFontFamilies(fontId);
                    if (fontName.count() == 0) {
                        qDebug("load fontawesome-webfont.ttf error");
                    }
        }
        iconFont=QFont("FontAwesome");
        qApp->setFont(iconFont);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    上述两个代码分别设置了style和font,其中资源的路径可以通过下图方式直接获取:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WEt3ziGR-1663406172993)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220917170811499.png)]

    使用Path和URL都是可以的。

    关于字体图标的使用,这里多写几句。一般的除了ttf文件,还会有一个图形字体(Unicode)对照表,我们将widget的文本设置为Unicode就可以看到它的图形。

        connectPB=new QPushButton(QChar(0xf0f9));
    
    • 1
  • 相关阅读:
    消息队列全面解析
    QT调用python程序出现问题Failed to get function
    基于php的物流系统设计与实现
    Java WebSocket服务在多tomcat服务下怎么进行互通,websocket多服务负载均衡下怎么进行交互,websocket客户端调用实例
    跟着我一起通关java面试吧(30)
    Jenkins学习笔记1
    设计模式:访问者模式(C++实现)
    (附源码)spring boot分布式文件系统 毕业设计 182251
    再想一想GPT
    R语言为矩阵的行和列命名:rownames函数指定矩阵行名称、colnames函数指定矩阵列名称
  • 原文地址:https://blog.csdn.net/zhudaokuan/article/details/126908127