Qt fichiers de ressources avec CMake et AUTORCC

Solution:

Ajouter des fichiers de ressources dans la add_executable() déclaration

Problème

(pas dans le add_library())

Ne parviennent pas à définir la fenêtre principale de l'icône.

Notes:

  • Lorsque je n'utilise pas AUTORCC je rencontre quelques problèmes lors de la compilation:
    QtCore/qglobal.h: no such file or directory. Mais, je ne préfère AUTORCC plus moderne CMake approche.

  • Sans AUTORCC (différents CMakeLists.txt que la condition) et Qt 4.6.2 le code actuel travaillé.
    différentes CMakeLists.txt)

Code

C'est un réduit de code de mon projet. Arbre:

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

ressources/ressources.qrc

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

Modifier

C'est le générés 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))

Système

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

  • :/images/logo.png?
  • :/image/logo.png est juste un fichier png que je veux mettre un logo. par exemple, flaticon.com/free-icon/eye-outline_23912
  • Désolé, c'était un peu trop court 😉 Avez-vous essayé cette chaîne? Il devrait être la bonne et n'est pas dans la liste de ce que vous avez essayé.
  • Ne pas travailler trop... (le répertoire est images/
  • La ressource est correctement lu dans un .cpp fichier? Vérifier qrc_resources.cpp dans votre dossier de création. C'est un .cpp fichier contenant toutes les données binaires à être compilé dans la cible.
  • Il semble aller pour le mieux. Cochez la case modifier en post si vous le souhaitez.
  • L'erreur obtenez-vous lors de l'utilisation de :/images/logo.png?
  • Pas d'erreur. Icône de la fenêtre n'est pas définie si.
  • Essayez qDebug() << QIcon(":images/logo.png").pixmap(16, 16).size(). Cela devrait vous donner une idée si le fichier image peut être chargé à partir de l'application.
  • Laissez-nous continuer cette discussion dans le chat.