Qt资源文件与CMake和AUTORCC

解答

add_executable()语句中添加资源文件

问题

(不在add_library()

未能设置主窗口图标。

备注

  • 当我不使用AUTORCC遇到了一些编译问题: QtCore/qglobal.h: no such file or directory 。 但是,我更喜欢AUTORCC作为更现代的CMake方法。

  • 没有AUTORCC(与提供的不同的CMakeLists.txt)和Qt-4.6.2,当前的代码工作。 不同的CMakeLists.txt)

这是我的项目最小化的代码。 树:

 |- CMakeLists.txt |- main_window.hpp |- main_window.cpp |- main.cpp |- resources | - resources.qrc | - images | - logo.png 

main_window.cpp

 #ifndef MAINWINDOW_HPP #define MAINWINDOW_HPP #include <QMainWindow> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(); }; #endif 

main_window.cpp

 #include "main_window.hpp" MainWindow::MainWindow() { // i tried ":/images.png", ":/resources/images/logo.png", ":/logo.png" setWindowIcon(QIcon(":images/logo.png")); } 

main.cpp中

 #include <QApplication> #include "main_window.hpp" int main(int argc, char *argv[]) { QApplication app(argc, argv); app.setOrganizationName("Organization"); app.setApplicationName("Application Example"); MainWindow mainWin; mainWin.show(); return app.exec(); 

}

CMakeLists.txt

 cmake_minimum_required(VERSION 3.1) project(qt_project) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) find_package(Qt4 4.6 REQUIRED) set(QT_USE_QTGUI TRUE) set(QT_USE_QTXML TRUE) include(${QT_USE_FILE}) add_definitions(${QT_DEFINITIONS}) // NOTE: it would be more convenient to be able to add the // resource file here upon the creation of the library add_library(mylib main_window.cpp) // SOLVED // BEFORE: add_executable(qt_test main.cpp) add_executable(qt_test main.cpp resources/resources.qrc) target_link_libraries(qt_test mylib ${QT_LIBRARIES} ) 

资源/ resources.qrc

 <!DOCTYPE RCC><RCC version="1.0"> <qresource> <file>images/logo.png</file> </qresource> </RCC> 

编辑

这是生成的qrc_resources.cxx

 #include <QtCore/qglobal.h> static const unsigned char qt_resource_data[] = { // /users/ddakop/dev/misc/qt/resources/images/logo.png // ... removed hex data }; static const unsigned char qt_resource_name[] = { // images // ... removed hex data // logo.png // ... removed hex data }; static const unsigned char qt_resource_struct[] = { // : 0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1, // :/images 0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x2, // :/images/logo.png 0x0,0x0,0x0,0x12,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0, }; 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_resources)() { QT_PREPEND_NAMESPACE(qRegisterResourceData) (0x01, qt_resource_struct, qt_resource_name, qt_resource_data); return 1; } Q_CONSTRUCTOR_FUNCTION(QT_MANGLE_NAMESPACE(qInitResources_resources)) int QT_MANGLE_NAMESPACE(qCleanupResources_resources)() { QT_PREPEND_NAMESPACE(qUnregisterResourceData) (0x01, qt_resource_struct, qt_resource_name, qt_resource_data); return 1; } Q_DESTRUCTOR_FUNCTION(QT_MANGLE_NAMESPACE(qCleanupResources_resources)) 

系统

CentOS-5,Qt-4.8.6,CMake-3.2.1,gcc-4.8.2

我想你需要链接qrc_resources生成的文件。

我想你知道下一个信息:

http://www.cmake.org/cmake/help/v3.0/manual/cmake-qt.7.html

你可以在哪里看到下一行:

 add_executable(myexe main.cpp resource_file.qrc) 

更多信息:

http://www.cmake.org/cmake/help/v3.0/prop_tgt/AUTORCC.html