Código C++:
Ver originalQStringList *ListaValores = new QStringList();
QString cadenaConsulta = "SELECT DISTINCT "+campo[i]+" FROM socios order by "+campo[i];
consulta.exec(cadenaConsulta);
while(consulta.next())
{
*ListaValores << consulta.value(0).toStringList();
}
completer = new QCompleter(*ListaValores);
completer->setCaseSensitivity(Qt::CaseInsensitive);
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 originalQStringList ListaValores;
QString cadenaConsulta = "SELECT DISTINCT "+campo[i]+" FROM socios order by "+campo[i];
consulta.exec(cadenaConsulta);
while(consulta.next())
{
ListaValores << consulta.value(0).toStringList();
}
completer = new QCompleter(ListaValores);
Para reutilizar ese código tienes dos opciones:
- Creas un widget personalizado para la ocasión
- 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 originalclass CustomLineEdit: public QLineEdit
{
Q_OBJECT
public:
CustomLineEdit(QWidget* parent)
: QLineEdit(parent)
{
ConfigurarCompleter();
}
~CustomLineEdit() = default;
private:
void ConfigurarCompleter()
{
QStringList ListaValores;
QString cadenaConsulta = "SELECT DISTINCT "+campo[i]+" FROM socios order by "+campo[i];
consulta.exec(cadenaConsulta);
while(consulta.next())
{
ListaValores << consulta.value(0).toStringList();
}
completer = new QCompleter(ListaValores,this);
completer->setCaseSensitivity(Qt::CaseInsensitive);
setCompleter(completer);
}
};
La opción B, como te comenté, pasa por usar una clase externa que configure los widgets. Algo tal que:
Código C++:
Ver originalstruct CustomClass
{
static void ConfigureCompleter(QLineEdit& widget)
{
QStringList ListaValores;
QString cadenaConsulta = "SELECT DISTINCT "+campo[i]+" FROM socios order by "+campo[i];
consulta.exec(cadenaConsulta);
while(consulta.next())
{
ListaValores << consulta.value(0).toStringList();
}
completer = new QCompleter(ListaValores,&widget);
completer->setCaseSensitivity(Qt::CaseInsensitive);
widget.setCompleter(completer);
}
};
Y para el
QComboBox más de lo mismo.
Un saludo.