Ver Mensaje Individual
  #7 (permalink)  
Antiguo 14/09/2016, 03:14
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Qt.QTableView. Varias dudas

Código C++:
Ver original
  1. class IconoSexo
  2. {
  3.   public:
  4.     static IconoSexo& getIcon();
  5.     int male();
  6.     int female();
  7.  
  8. };

Con esa interfaz es imposible recuperar los iconos ya que no hay ningún método público que devuelva un QIcon.

Por otro lado es poco práctico tener un método exclusivo para cada icono a devolver. En su lugar es mejor declarar un enumerado:

Código C++:
Ver original
  1. enum class IconosSexo
  2. {
  3.   Undefined,
  4.   Male,
  5.   Female
  6. };
  7.  
  8. class IconoSexo
  9. {
  10.   public:
  11.     static IconoSexo& getIcon();
  12.  
  13.     QIcon GetIcon(IconosSexo tipo);
  14. };

Aunque quizás sería más adecuado disponer de un único reservorio de iconos en vez de ir creando clases como si fuesen champiñones. Además para este uso no veo necesario crear un singletone. A mi modo de ver es más práctico tener una clase estática.

Código C++:
Ver original
  1. enum IconType
  2. {
  3.   Undefined,
  4.   Male,
  5.   Female,
  6.   AnotherOne,
  7. };
  8.  
  9. class IconWareHouse
  10. {
  11.   public:
  12.     static QIcon GetIcon(IconType type)
  13.     {
  14.       auto it = _icons.find(type);
  15.       if( it == _icons.end() )
  16.       {
  17.         // algoritmo para cargar el icono
  18.         // ...
  19.  
  20.         // Se añade el icono a la caché
  21.         it = _icons.insert(std::make_pair(type,icon));
  22.       }
  23.  
  24.       return it->second;
  25.     }
  26.  
  27.   private:
  28.  
  29.     static std::map<IconType,QIcon> _icons;
  30. };

En cuanto al fallo que comentas al usar el singletone, el problema es que estás intentando hacer una copia de la clase, cosa que al ser singleton no está permitido.

Deberías recuperar una referencia en ese caso.

Eso sí, nota que las variables creadas como referencia únicamente se pueden asignar una vez y que la misma ha de realizarse en la creación de la variable. Necesitarías algo así:

Código C++:
Ver original
  1. class MiModel
  2. {
  3.   IconosSexo& icono;
  4.  
  5.     MiModel::MiModel(QObject *parent):QAbstractTableModel(parent)
  6.       : icono(IconoSexo::getIcon())
  7.     {
  8.         rellenarLista();
  9.     }
  10. };

Aunque quizás lo más recomendable sería crear una variable local cuando la necesites:

Código C++:
Ver original
  1. void MiModel::rellenarLista()
  2. {
  3.   auto& icon = IconoSexo::getIcon();
  4.   // ...
  5. }

Todo esto suponiendo que no optas por convertir el repositorio de iconos en una clase estática... en ese caso no será necesario almacenar referencias en ningún sitio.

PD.: También podrías almacenar un puntero a la instancia, aunque no es una acción recomendable:

Código C++:
Ver original
  1. IconoSexo* ptr = &IconoSexo::getIcon();

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.