Ver Mensaje Individual
  #2 (permalink)  
Antiguo 21/04/2016, 05:24
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 3 meses
Puntos: 204
Respuesta: Qt. Reutilizar widgets en distintas partes del programa

Código C++:
Ver original
  1. QStringList *ListaValores = new QStringList();
  2. QString cadenaConsulta = "SELECT DISTINCT "+campo[i]+" FROM socios order by "+campo[i];            
  3. consulta.exec(cadenaConsulta);
  4. while(consulta.next())
  5. {
  6.   *ListaValores << consulta.value(0).toStringList();                
  7. }
  8. completer = new QCompleter(*ListaValores);
  9. completer->setCaseSensitivity(Qt::CaseInsensitive);
  10. editor[i]->setCompleter(completer);

En esas líneas tienes una fuga de memoria. ListaValores es un puntero... a completer le pasas una copia del elemento asociado al puntero luego estás dejando memoria sin liberar.

Salvo que luego hagas cosas con ese punteor que no estén reflejadas en este código deberías dejar el código tal que:

Código C++:
Ver original
  1. QStringList ListaValores;
  2. QString cadenaConsulta = "SELECT DISTINCT "+campo[i]+" FROM socios order by "+campo[i];            
  3. consulta.exec(cadenaConsulta);
  4. while(consulta.next())
  5. {
  6.   ListaValores << consulta.value(0).toStringList();                
  7. }
  8. completer = new QCompleter(ListaValores);

Para reutilizar ese código tienes dos opciones:
  1. Creas un widget personalizado para la ocasión
  2. Creas una clase que encapsule este código y configure el widget que le pidas.

Crear un widget personalizado tiene la ventaja de que el propio widget se encargará de configurarse. La parte mala es que salvo que implementes un plugin para QtCreator el widget únicamente podrás usarlo en el diseñador mediante promoción.

No se dónde tienes pensado configurar el widget, pero podría ser algo tal que:

Código C++:
Ver original
  1. class CustomLineEdit: public QLineEdit
  2. {
  3.   Q_OBJECT
  4.  
  5.   public:
  6.  
  7.     CustomLineEdit(QWidget* parent)
  8.       : QLineEdit(parent)
  9.     {
  10.       ConfigurarCompleter();
  11.     }
  12.  
  13.     ~CustomLineEdit() = default;
  14.  
  15.   private:
  16.  
  17.     void ConfigurarCompleter()
  18.     {
  19.       QStringList ListaValores;
  20.       QString cadenaConsulta = "SELECT DISTINCT "+campo[i]+" FROM socios order by "+campo[i];            
  21.       consulta.exec(cadenaConsulta);
  22.       while(consulta.next())
  23.       {
  24.         ListaValores << consulta.value(0).toStringList();                
  25.       }
  26.       completer = new QCompleter(ListaValores,this);
  27.       completer->setCaseSensitivity(Qt::CaseInsensitive);
  28.       setCompleter(completer);
  29.     }
  30. };

La opción B, como te comenté, pasa por usar una clase externa que configure los widgets. Algo tal que:

Código C++:
Ver original
  1. struct CustomClass
  2. {
  3.     static void ConfigureCompleter(QLineEdit& widget)
  4.     {
  5.       QStringList ListaValores;
  6.       QString cadenaConsulta = "SELECT DISTINCT "+campo[i]+" FROM socios order by "+campo[i];            
  7.       consulta.exec(cadenaConsulta);
  8.       while(consulta.next())
  9.       {
  10.         ListaValores << consulta.value(0).toStringList();                
  11.       }
  12.       completer = new QCompleter(ListaValores,&widget);
  13.       completer->setCaseSensitivity(Qt::CaseInsensitive);
  14.       widget.setCompleter(completer);
  15.     }
  16. };

Y para el QComboBox más de lo mismo.

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.