Question

J'ai la situation suivante: Je dois créer un widget dans la bibliothèque statique autonome, qui alors sera liée à l'application finale (Visual C ++ 9.0, qt 4.5). Cette bibliothèque widget statique contient des ressources (icônes) et se composent d'un plusieurs fichiers .cpp (chacun contient un widget autonome). Pour autant que je sache, je dois initialiser le système de ressources qt, si je les utilise (ressources) dans la bibliothèque statique, avec appel à « Q_INIT_RESOURCE (resource_file_name) ». Je résolu ce problème avec le code suivant (dans chaque fichier .cpp dans la bibliothèque statique):


#include <QAbstractButton>

namespace {
struct StaticLibInitializer
{
    StaticLibInitializer()
    {
        Q_INIT_RESOURCE(qtwidgets_custom_resources);
    }
};
StaticLibInitializer staticLibInitializer;
} 

// ... widget code ....

Au lieu de ma première approche, j'ai créé le fichier init.cpp séparé dans le projet de bibliothèque statique avec le code d'initialisation (pour éviter d'inclure le code d'initialisation dans chaque fichier .cpp), mais cela ne fonctionne pas.

Pourquoi cela ne fonctionne pas?

Cette approche est avec StaticLibInitializer est sûr et portable entre les différents compilateurs et plates-formes?

Était-ce utile?

La solution

Il ne fonctionne pas parce que vous avez réussi à faire frapper par ordre d'initialisation statique fiasco.

Vous ne pouvez pas déplacer votre code qui initialise des objets statiques intransportables l'unité de traduction (vous pouvez le lire comme fichier source) où ces objets statiques sont utilisés. Pas la façon dont vous l'avez fait. Si vous voulez utiliser le système que vous utilisez pour initialiser ces objets statiques que de se déplacer uniquement déclarations à votre tête de init.hpp mais laissez instanciations StaticLibInitializer staticLibInitializer; dans chaque fichier qui utilise des objets statiques.
conseils ci-dessus prend chaque widget de utilise uniquement ses propres ressources. Si vous avez la situation dans laquelle une des ressources de widget sont utilisés par un autre widget vous rencontrez fiasco dans l'ordre d'initialisation statique à nouveau. Vous pouvez gérer cette situation en utilisant le code comme ceci

StaticLibInitializer
{
    void initialize()
    {
        static Q_INIT_RESOURCE(qtwidgets_custom_resources);
    }

    StaticLibInitializer()
    {
         initialize();
    }
}

pour faire instanciations sûr de multiplication de StaticLibInitializer initialise ressource donnée une seule fois et puis instancier StaticLibInitializer pour chaque ressource que vous allez utiliser dans l'unité de traduction donnée.

Autres conseils

La macro Q_INIT_RESOURCE ne peut pas être utilisé dans un espace de noms.

Permettez-moi de citer le manuel qt: « Remarque:. Cette macro ne peut pas être utilisé dans un espace de noms Il doit être appelée main () ». Et même il vous donne un exemple comment le faire droit, si cela est impossible:

  inline void initMyResource() { Q_INIT_RESOURCE(myapp); }

    namespace MyNamespace
    {
     ...

     void myFunction()
     {
         initMyResource();
     }
  }

S'il vous plaît vous regarder pourquoi et comment exactement il échoue ou ne manque pas si vous l'utilisez d'une manière quelconque. Le code correspondant est en QtCore.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top