• Q_INIT_RESOURCE宏


     

    QT应用程序,无论是exe,staticlib,还是dll程序,都可以通过qrc文件来导入各种资源。

    qrc会将这些资源文件转换为相应代码,参与应用程序的编译。

    这样做的好处就是:简化了应用程序发布时还需要同步发布各类资源文件的烦恼,

    缺点就是:应用程序会相对变大;

    但是,如果我们创建的事staticlib工程,(staticlib工程的创建是通TEMPLATE=lib, LIB = staticlib的pro文件实现),那在引用lib文件的工程中,就需要试用 Q_INIT_RESOURCE宏来显示初始化资源,例如:

        libstest是一个静态库,它通过libtest.qrc文件引入资源;

         libtestapp是试用libtest.lib的exe程序,则在libtestapp中,需要显示通过Q_INIT_RESOURCE宏初四花libtest的资源;

    如下:

        Q_INIT_RESOURCE(libtest) // qrc文件名。

    通过QT源代码可以发现:Q_INIT_RESOURCE宏对应生成了两个库函数:

    #define Q_INIT_RESOURCE(name)
        do { extern int QT_MANGLE_NAMESPACE(qInitResources_ ## name) ();      
            QT_MANGLE_NAMESPACE(qInitResources_ ## name) (); } while (0)
    #define Q_CLEANUP_RESOURCE(name)
        do { extern int QT_MANGLE_NAMESPACE(qCleanupResources_ ## name) ();   
            QT_MANGLE_NAMESPACE(qCleanupResources_ ## name) (); } while (0)

    而qrc在将qrc文件转换为相应代码时,会实现qInitResources_name和qCleanupResources_name函数,如下:

    QT_BEGIN_NAMESPACE

    extern Q_CORE_EXPORT bool qRegisterResourceData
        (int, const unsigned char *, const unsigned char *, const unsigned char *);

    extern Q_CORE_EXPORT bool qUnregisterResourceData
        (int, const unsigned char *, const unsigned char *, const unsigned char *);

    QT_END_NAMESPACE


    int QT_MANGLE_NAMESPACE(qInitResources_q6800app)()
    {
        QT_PREPEND_NAMESPACE(qRegisterResourceData)
            (0x01, qt_resource_struct, qt_resource_name, qt_resource_data);
        return 1;
    }

    Q_CONSTRUCTOR_FUNCTION(QT_MANGLE_NAMESPACE(qInitResources_q6800app))

    int QT_MANGLE_NAMESPACE(qCleanupResources_q6800app)()
    {
        QT_PREPEND_NAMESPACE(qUnregisterResourceData)
           (0x01, qt_resource_struct, qt_resource_name, qt_resource_data);
        return 1;
    }

    Q_DESTRUCTOR_FUNCTION(QT_MANGLE_NAMESPACE(qCleanupResources_q6800app))

  • 相关阅读:
    帮助应届生、年轻程序员快速成长的12个锦囊<转载>
    曾国藩教您:如何富过三代
    Mvc示例代码调试之二——调试示例讲解
    如何处理婚姻问题
    jQuery对象与dom对象相互转换
    Mvc示例代码调试之一----调试工具及设置(用firebug与vs联合调试)
    Mvc示例之三——用Filter进行简单身份验证
    沟通的艺术
    做bs开发需要学习哪些技术
    我所读过的技术书籍
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/3944201.html
Copyright © 2020-2023  润新知