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))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章