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