zoukankan      html  css  js  c++  java
  • 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))

  • 相关阅读:
    毕业了,少感慨,多努力
    NHibernate初学者指南(19):验证复杂业务规则
    从DataSet导出Txt
    NHibernate初学者指南(20):开发中常见的错误(一)
    高级Linux程序设计第三章:进程
    有关Lucene的问题(5):Lucene中的TooManyClause异常
    Lucene学习总结之九:Lucene的查询对象(3)
    高级Linux程序设计第二章:编写良好的Linux软件
    Lucene学习总结之八:Lucene的查询语法,JavaCC及QueryParser(1)
    Lucene学习总结之八:Lucene的查询语法,JavaCC及QueryParser(2)
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/3944201.html
Copyright © 2011-2022 走看看