Pregunta

Tengo siguiente situación: Necesito crear Widget en biblioteca estática independiente, que a continuación se enlazará con la aplicación final (c visual ++ 9,0, qt 4.5). Esta biblioteca contiene estática widget de algunos recursos (iconos), y consisten en un varios archivos .cpp (cada uno contiene autónomo Widget). Por lo que yo sé, debo inicializar el sistema de recursos qt, si ellos (los recursos) su uso en la biblioteca estática, la llamada a "Q_INIT_RESOURCE (resource_file_name)". He resuelto esto con el código siguiente (en cada archivo .cpp en la biblioteca estática):


#include <QAbstractButton>

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

// ... widget code ....

En lugar de mi primer acercamiento, he creado el archivo init.cpp separada en el proyecto de biblioteca estática con el código de inicialización (para evitar la inclusión de código de inicialización en cada archivo .cpp), pero esto no funcionó.

¿Por qué esto no funciona?

¿Es este enfoque con StaticLibInitializer es segura y portátil entre varios compiladores y plataformas?

¿Fue útil?

Solución

No funcionó porque se las arregló para ser golpeado por estática inicialización fin fiasco.

No se puede mover el código que inicializa los objetos estáticos outsize la unidad de traducción (se puede leer como archivo de origen) que se utilizan estos objetos estáticos. No es la forma en que lo hizo. Si desea utilizar el esquema que está utilizando para inicializar estos objetos estáticos que moverse sólo a sus declaraciones de cabecera init.hpp pero dejan instatiations StaticLibInitializer staticLibInitializer; en cada archivo que utiliza objetos estáticos.
consejo anterior asume cada uno utiliza para widgets sólo sus propios recursos. Si usted tiene situación en la que los recursos de un widget se utilizan por otro widget que ejecutar en orden de inicialización estática fiasco de nuevo. Usted puede manejar esta situación mediante el uso de un código como éste

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

    StaticLibInitializer()
    {
         initialize();
    }
}

para hacer ejemplificaciones Seguro multiplican de StaticLibInitializer se inicializar recurso dado una sola vez y luego instantiate StaticLibInitializer para cada recurso que se va a usar en la unidad de traducción dada.

Otros consejos

La macro Q_INIT_RESOURCE no se puede utilizar en un espacio de nombres.

Permítanme citar el qt instrucciones de uso "Nota: Esta macro no se puede utilizar en un espacio de nombres Debe ser llamado desde main ()". E incluso le da un ejemplo de cómo hacer las cosas bien, si esto no es posible:

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

    namespace MyNamespace
    {
     ...

     void myFunction()
     {
         initMyResource();
     }
  }

Por favor, busque usted mismo por qué y cómo es exactamente lo que falla o no falla si se utiliza de una manera no especificada. El código en cuestión está en QtCore.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top