Domanda

Ho situazione prossima: ho bisogno di creare widget nella libreria statica autonoma, che poi sarà collegato con l'applicazione finale (Visual C ++ 9.0, Qt 4.5). Questa libreria di widget statico contiene alcune risorse (icone), e sono costituiti da un più file cpp (ognuno contiene widget di stand-alone). Per quanto ne so, devo inizializzare sistema di risorse qt, se li (risorse) uso nella libreria statica, con la chiamata a "Q_INIT_RESOURCE (resource_file_name)". Ho risolto questo con codice successivo (in ogni file cpp nella libreria statica):


#include <QAbstractButton>

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

// ... widget code ....

Al posto del mio primo approccio, ho creato il file init.cpp separata nel progetto di libreria statica con codice di inizializzazione (per evitare di includere il codice di inizializzazione in ogni file cpp), ma questo non ha funzionato.

Perché questo non ha funzionato?

E 'questo approccio con StaticLibInitializer è sicuro e portatile tra i vari compilatori e piattaforme?

È stato utile?

Soluzione

Non ha funzionato perché sei riuscito a essere colpito da ordine di inizializzazione statico fiasco.

Non è possibile spostare il codice che inizializza oggetti statici fuori misura l'unità di traduzione (si può leggere come file di origine) in cui vengono utilizzati questi oggetti statici. Non è il modo avete fatto. Se si desidera utilizzare lo schema che si utilizza per inizializzare questi oggetti statici che spostare solo le dichiarazioni per l'intestazione init.hpp ma lasciare instatiations StaticLibInitializer staticLibInitializer; in ogni file che utilizza oggetti statici.
consigli di cui sopra assume ciascun widget utilizza esclusivamente le proprie risorse. Se si dispone di situazione in cui le risorse un widget sono utilizzati da un altro widget si esegue in statica fiasco ordine di inizializzazione di nuovo. È possibile gestire questa situazione utilizzando il codice come questo

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

    StaticLibInitializer()
    {
         initialize();
    }
}

per assicurarsi che le istanze di moltiplicare StaticLibInitializer inizializzare data risorsa sola volta e poi istanziare StaticLibInitializer per ogni risorsa che si sta per utilizzare in data unità di traduzione.

Altri suggerimenti

La macro Q_INIT_RESOURCE non può essere utilizzato in uno spazio dei nomi.

Cito dal manuale qt: "Nota:. Questa macro non può essere utilizzato in uno spazio dei nomi Dovrebbe essere chiamato da main ()". E anche ti dà un esempio di come farlo nel modo giusto, se questo non è possibile:

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

    namespace MyNamespace
    {
     ...

     void myFunction()
     {
         initMyResource();
     }
  }

Si prega di guardare te stesso perché e come esattamente si riesce o non fallisce se lo si utilizza in modo non specificato. Il codice di riferimento è in QtCore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top