DatabaseConnectionDialog/es: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 1: Line 1:
[[Category:HowTo]]<br />[[Category:snippets]]<br />[[Category:QtDevelopmentSpanish::General]]
[[Category:HowTo]]
[[Category:snippets]]
[[Category:QtDevelopmentSpanish::General]]


= Dialog de Conexión a Base de Datos =
= Dialog de Conexión a Base de Datos =
Line 11: Line 13:
<code>DatabaseConnectionDialog* dialog = new DatabaseConnectionDialog(this);
<code>DatabaseConnectionDialog* dialog = new DatabaseConnectionDialog(this);


// opcional: preparando los datos que mostraremos al usuario en un formulario auto-completado<br /> dialog-&gt;setDatabaseName( &quot;mydb&amp;quot; );<br /> dialog-&gt;setDatabasePortNumber( 1234 );<br /> dialog-&gt;setDatabaseHostName( &quot;localhost&amp;quot; );<br /> dialog-&gt;setDatabaseUsername( &quot;luca&amp;quot; );<br /> dialog-&gt;setDatabaseDriverName( &quot;QPSQL&amp;quot; );<br /> dialog-&gt;setDatabasePassword( &quot;pwd&amp;quot; );
// opcional: preparando los datos que mostraremos al usuario en un formulario auto-completado
dialog->setDatabaseName( "mydb" );
dialog->setDatabasePortNumber( 1234 );
dialog->setDatabaseHostName( "localhost" );
dialog->setDatabaseUsername( "luca" );
dialog->setDatabaseDriverName( "QPSQL" );
dialog->setDatabasePassword( "pwd" );


// habilitando el botón de conectar si todos los datos son correctos<br /> dialog-&gt;checkFormData();<br /> // contactando la signal del dialog con el slot donde usaremos la conexion<br /> connect( dialog,<br /> SIGNAL (databaseConnect(QSqlDatabase&amp;amp;)),<br /> this,<br /> SLOT (slotHandleNewDatabaseConnection(QSqlDatabase&amp;amp;)));
// habilitando el botón de conectar si todos los datos son correctos
dialog->checkFormData();
// contactando la signal del dialog con el slot donde usaremos la conexion
connect( dialog,
SIGNAL (databaseConnect(QSqlDatabase&amp;amp;)),
this,
SLOT (slotHandleNewDatabaseConnection(QSqlDatabase&amp;amp;)));


// mostramos el dialog (sin auto-conexion)<br /> dialog-&gt;run( false );</code>
// mostramos el dialog (sin auto-conexion)
dialog->run( false );</code>


El dialog nos permite pre-inicializar los campos del formulario, asi como el modo de auto-conectar que hace que la conexión sea automática si todos los datos están en su lugar.<br />Notemos que este dialog puede ser perfeccionado de varias formas, y representa además un punto de partida para una conexión a base de datos más específica.
El dialog nos permite pre-inicializar los campos del formulario, asi como el modo de auto-conectar que hace que la conexión sea automática si todos los datos están en su lugar.
Notemos que este dialog puede ser perfeccionado de varias formas, y representa además un punto de partida para una conexión a base de datos más específica.


=== Modo Auto-Conectar ===
=== Modo Auto-Conectar ===


Cuando el método &lt;code&amp;gt;run()&lt;/code&amp;gt; se invoca puede especificarse el modo de autoconectar con el valor booleano de ''true''. En este modo si todos los campos estan llenos el dialog inmediatamente intenta conectarse a la base de datos, y en caso de lograrlo transparente al usuario emite el signal.<br />En caso de que los datos del formulario no estén completos o la conexión no se pueda establecer el dialog se muestra nuevamente. Si el modo de autoconectar esta apagado (parámetro = ''false'') el dialog siempre se mostrará.
Cuando el método <code>run()</code> se invoca puede especificarse el modo de autoconectar con el valor booleano de ''true''. En este modo si todos los campos estan llenos el dialog inmediatamente intenta conectarse a la base de datos, y en caso de lograrlo transparente al usuario emite el signal.
En caso de que los datos del formulario no estén completos o la conexión no se pueda establecer el dialog se muestra nuevamente. Si el modo de autoconectar esta apagado (parámetro = ''false'') el dialog siempre se mostrará.


=== Código de fuente ===
=== Código de fuente ===
Line 27: Line 44:
El siguiente código es del fichero de encabezado (header):
El siguiente código es del fichero de encabezado (header):


<code>/*!<br /> * databasedialog.h<br /> '''/<br />#ifndef DATABASEDIALOG_H<br />#define DATABASEDIALOG_H
<code>/*!
<br />#include &lt;QDialog&amp;gt;<br />#include &lt;QLabel&amp;gt;<br />#include &lt;QLineEdit&amp;gt;<br />#include &lt;QComboBox&amp;gt;<br />#include &lt;QSpinBox&amp;gt;<br />#include &lt;QDialogButtonBox&amp;gt;<br />#include &lt;QHBoxLayout&amp;gt;<br />#include &lt;QVBoxLayout&amp;gt;<br />#include &lt;QGridLayout&amp;gt;<br />#include &lt;QSqlDatabase&amp;gt;<br />#include &lt;QString&amp;gt;<br />#include &lt;QMessageBox&amp;gt;<br />#include &lt;QDebug&amp;gt;<br />#include &lt;QSqlError&amp;gt;<br />#include &lt;QPushButton&amp;gt;<br />#include &lt;QGroupBox&amp;gt;
* databasedialog.h
<br />class DatabaseConnectionDialog : public QDialog<br />{<br /> Q_OBJECT
*/
<br />private:
#ifndef DATABASEDIALOG_H
<br /> /'''!<br /> * La etiqueta para el driver de la base de datos.<br /> '''/<br /> QLabel''' labelDatabaseDriverName;
#define DATABASEDIALOG_H


/*!<br /> * La etiqueta para el puerto TCP/IP que la base de datos<br /> * utiliza para las conexiones entrantes.<br /> '''/<br /> QLabel''' labelDatabasePort;
#include <QDialog>
#include <QLabel>
#include <QLineEdit>
#include <QComboBox>
#include <QSpinBox>
#include <QDialogButtonBox>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QGridLayout>
#include <QSqlDatabase>
#include <QString>
#include <QMessageBox>
#include <QDebug>
#include <QSqlError>
#include <QPushButton>
#include <QGroupBox>


/*!<br /> * La etiqueta para el nombre de la base de datos.<br /> '''/<br /> QLabel''' labelDatabaseName;
class DatabaseConnectionDialog : public QDialog
{
Q_OBJECT


/*!<br /> * La etiqueta para el nombre de la máquina.<br /> '''/<br /> QLabel''' labelDatabaseHostName;
private:


/*!<br /> * La etiqueta para el nombre de usuario.<br /> '''/<br /> QLabel''' labelDatabaseUsername;
/*!
* La etiqueta para el driver de la base de datos.
*/
QLabel''' labelDatabaseDriverName;


/*!<br /> * La etiqueta para la contraseña.<br /> '''/<br /> QLabel''' labelDatabasePassword;
/*!
* La etiqueta para el puerto TCP/IP que la base de datos
* utiliza para las conexiones entrantes.
*/
QLabel''' labelDatabasePort;


/*!<br /> * Una etiqueta para mostrar la URL de la conexión<br /> * a la base de datos.<br /> '''/<br /> QLabel''' labelDatabaseURL;
/*!
* La etiqueta para el nombre de la base de datos.
*/
QLabel''' labelDatabaseName;


/*!<br /> * El nombre de la base de datos a la que el<br /> * usuario desea conectarse.<br /> '''/<br /> QLineEdit''' editDatabaseName;
/*!
* La etiqueta para el nombre de la máquina.
*/
QLabel''' labelDatabaseHostName;


/*!<br /> * El nombre del servidor donde se encuentra la base<br /> * de datos.<br /> '''/<br /> QLineEdit''' editDatabaseHostName;
/*!
* La etiqueta para el nombre de usuario.
*/
QLabel''' labelDatabaseUsername;


/*!<br /> * El puerto de escucha del servidor de base de datos.<br /> '''/<br /> QSpinBox''' spinBoxDatabasePort;
/*!
* La etiqueta para la contraseña.
*/
QLabel''' labelDatabasePassword;


/*!<br /> * El usuario para la conexión a la base de datos.<br /> '''/<br /> QLineEdit''' editDatabaseUsername;
/*!
* Una etiqueta para mostrar la URL de la conexión
* a la base de datos.
*/
QLabel''' labelDatabaseURL;


/*!<br /> * Para poner la contraseña de la conexión a la base de datos.<br /> '''/<br /> QLineEdit''' editDatabasePassword;
/*!
* El nombre de la base de datos a la que el
* usuario desea conectarse.
*/
QLineEdit''' editDatabaseName;


/*!<br /> * El combo desde donde el usuario puede seleccionar el<br /> * driver y tipo de base de datos.<br /> '''/<br /> QComboBox''' comboDatabaseDriverName;
/*!
* El nombre del servidor donde se encuentra la base
* de datos.
*/
QLineEdit''' editDatabaseHostName;


/*!<br /> * Un Dialog para mostrar los botones de conexión<br /> * conectar/cancelar.<br /> '''/<br /> QDialogButtonBox''' buttons;
/*!
* El puerto de escucha del servidor de base de datos.
*/
QSpinBox''' spinBoxDatabasePort;


/*!<br /> * Un método para crear todos los componentes del dialog<br /> * y alinearlos correctamente.<br /> '''/<br /> void setUpGUI();
/*!
<br /> /'''!<br /> * Para buscar y generar el combo con los controladores disponibles<br /> * para establecer la conexión con la base de datos.<br /> '''/<br /> void findAvailableDrivers();
* El usuario para la conexión a la base de datos.
*/
QLineEdit''' editDatabaseUsername;


<br /> /'''!<br /> * Para realizar la conexión con la base de datos<br /> * y emitir la señal para que pueda ser usada por otros.<br /> */<br /> void doDatabaseConnection();
/*!
* Para poner la contraseña de la conexión a la base de datos.
*/
QLineEdit''' editDatabasePassword;


public:<br /> explicit DatabaseConnectionDialog(QWidget '''parent = 0);
/*!
<br /> /'''!<br /> * Para asignar el nombre de la base de datos.<br /> * dbName<br /> '''/<br /> void setDatabaseName( const QString&amp;amp; dbName );
* El combo desde donde el usuario puede seleccionar el
<br /> /'''!<br /> * Para asignar el puerto de escucha del servidor de base de datos.<br /> * portNumber<br /> '''/<br /> void setDatabasePortNumber( int&amp;amp; portNumber );
* driver y tipo de base de datos.
<br /> /'''!<br /> * Para asignar el nombre del servidor (nombre mnemónico).<br /> * hostname<br /> '''/<br /> void setDatabaseHostName( const QString&amp;amp; hostname );
*/
<br /> /'''!<br /> * Para asignar el usuario de conexion.<br /> * username<br /> '''/<br /> void setDatabaseUsername( const QString&amp;amp; username );
QComboBox''' comboDatabaseDriverName;
<br /> /'''!<br /> * Para seleccionar el nombre del controlador.<br /> * drvName (ademas del tipo de base de datos)<br /> '''/<br /> void setDatabaseDriverName( const QString&amp;amp; drvName );
<br /> /'''!<br /> * Para asignar la contraseña.<br /> * pwd<br /> '''/<br /> void setDatabasePassword( const QString&amp;amp; pwd );


<br /> /'''!<br /> * Realizar un chequeo contra los datos introducidos para habilitar/deshabilitar<br /> * el boton de conectar dependiendo del completado o no del formulario.<br /> '''true Devuelve verdadero si es satisfactoria la conexion<br />'''/<br /> bool checkFormData();
/*!
* Un Dialog para mostrar los botones de conexión
* conectar/cancelar.
*/
QDialogButtonBox''' buttons;


/*!<br /> * Realiza la conexion o muestra al usuario el Dialog en caso<br /> * de no haber completado el llenado o no haber podido realizar la<br /> * conexion automatica.<br /> * autoConnect si es ''true'' intenta conectarse automaticamente<br /> * si los datos estan completos, o avisa al usuario de los datos faltantes<br /> * Si es ''false'' simplemente muestra el Dialog y espera.<br /> '''/<br /> void run( bool autoConnect );
/*!
* Un método para crear todos los componentes del dialog
* y alinearlos correctamente.
*/
void setUpGUI();


<br />signals:
/*!
<br /> /'''!<br /> * Pasa la conexion en caso de que sea satisfactoria<br /> * databaseConnection Objeto<br /> '''/<br /> void databaseConnect( QSqlDatabase&amp;amp; databaseConnection );
* Para buscar y generar el combo con los controladores disponibles
<br />public slots:
* para establecer la conexión con la base de datos.
<br /> /'''!<br /> * Chequea si el usuario ha entrado los datos suficientes<br /> * para intentar conectarse a la base de datos<br /> '''/<br /> bool slotCheckFormData();
*/
void findAvailableDrivers();


<br /> /'''!<br /> * Realiza la conexion.<br /> */<br /> void slotPerformConnection();
 
/*!
* Para realizar la conexión con la base de datos
* y emitir la señal para que pueda ser usada por otros.
*/
void doDatabaseConnection();
 
public:
explicit DatabaseConnectionDialog(QWidget '''parent = 0);
 
/*!
* Para asignar el nombre de la base de datos.
* dbName
*/
void setDatabaseName( const QString&amp;amp; dbName );
 
/*!
* Para asignar el puerto de escucha del servidor de base de datos.
* portNumber
*/
void setDatabasePortNumber( int&amp;amp; portNumber );
 
/*!
* Para asignar el nombre del servidor (nombre mnemónico).
* hostname
*/
void setDatabaseHostName( const QString&amp;amp; hostname );
 
/*!
* Para asignar el usuario de conexion.
* username
*/
void setDatabaseUsername( const QString&amp;amp; username );
 
/*!
* Para seleccionar el nombre del controlador.
* drvName (ademas del tipo de base de datos)
*/
void setDatabaseDriverName( const QString&amp;amp; drvName );
 
/*!
* Para asignar la contraseña.
* pwd
*/
void setDatabasePassword( const QString&amp;amp; pwd );
 
 
/*!
* Realizar un chequeo contra los datos introducidos para habilitar/deshabilitar
* el boton de conectar dependiendo del completado o no del formulario.
'''true Devuelve verdadero si es satisfactoria la conexion
*/
bool checkFormData();
 
/*!
* Realiza la conexion o muestra al usuario el Dialog en caso
* de no haber completado el llenado o no haber podido realizar la
* conexion automatica.
* autoConnect si es ''true'' intenta conectarse automaticamente
* si los datos estan completos, o avisa al usuario de los datos faltantes
* Si es ''false'' simplemente muestra el Dialog y espera.
*/
void run( bool autoConnect );
 
 
signals:
 
/*!
* Pasa la conexion en caso de que sea satisfactoria
* databaseConnection Objeto
*/
void databaseConnect( QSqlDatabase&amp;amp; databaseConnection );
 
public slots:
 
/*!
* Chequea si el usuario ha entrado los datos suficientes
* para intentar conectarse a la base de datos
*/
bool slotCheckFormData();
 
 
/*!
* Realiza la conexion.
*/
void slotPerformConnection();


};
};


#endif // DATABASEDIALOG_H<br /></code>
#endif // DATABASEDIALOG_H
</code>


A continuación la implementación de la clase:
A continuación la implementación de la clase:


<code>#include &quot;databasedialog.h&amp;quot;
<code>#include "databasedialog.h"


DatabaseConnectionDialog::DatabaseConnectionDialog(QWidget '''parent) :<br /> QDialog(parent)<br />{<br /> // este dialog es modal<br /> setModal( true );<br /> // titulo del dialog<br /> setWindowTitle( tr(&quot;Conexion a base de datos&amp;quot;) );<br /> // seteando cada componente GUI<br /> setUpGUI();<br /> // cargando los controladores<br /> findAvailableDrivers();<br />}
DatabaseConnectionDialog::DatabaseConnectionDialog(QWidget '''parent) :
<br />void DatabaseConnectionDialog::setUpGUI()<br />{
QDialog(parent)
{
// este dialog es modal
setModal( true );
// titulo del dialog
setWindowTitle( tr("Conexion a base de datos") );
// seteando cada componente GUI
setUpGUI();
// cargando los controladores
findAvailableDrivers();
}


<br /> // creando todos los gui components<br /> labelDatabaseDriverName = new QLabel( tr(&quot;Database Type (driver name)&quot;), this );<br /> labelDatabasePort = new QLabel( tr(&quot;TCP/IP Port Number&amp;quot;), this );<br /> labelDatabaseName = new QLabel( tr(&quot;Database Name&amp;quot;), this );<br /> labelDatabaseHostName = new QLabel( tr(&quot;Host Name&amp;quot;), this );<br /> labelDatabaseUsername = new QLabel( tr(&quot;Username&amp;quot;), this );<br /> labelDatabasePassword = new QLabel( tr(&quot;Password&amp;quot;), this );<br /> labelDatabaseURL = new QLabel( this );<br /> labelDatabaseURL-&gt;setAlignment( Qt::AlignCenter );
void DatabaseConnectionDialog::setUpGUI()
<br /> spinBoxDatabasePort = new QSpinBox( this );<br /> spinBoxDatabasePort-&gt;setMaximum( 9999 );<br /> spinBoxDatabasePort-&gt;setMinimum( 100 );<br /> spinBoxDatabasePort-&gt;setSingleStep( 1 );
{
<br /> comboDatabaseDriverName = new QComboBox( this );<br /> comboDatabaseDriverName-&gt;setEditable( false );


<br /> editDatabaseName = new QLineEdit( this );<br /> editDatabaseHostName = new QLineEdit( this );<br /> editDatabaseUsername = new QLineEdit( this );<br /> editDatabasePassword = new QLineEdit( this );<br /> editDatabasePassword-&gt;setEchoMode( QLineEdit::Password );<br /> connect( editDatabaseName,<br /> SIGNAL (editingFinished()),<br /> this,<br /> SLOT (slotCheckFormData()) );<br /> connect( editDatabaseHostName,<br /> SIGNAL (editingFinished()),<br /> this,<br /> SLOT (slotCheckFormData()) );<br /> connect( editDatabaseUsername,<br /> SIGNAL (editingFinished()),<br /> this,<br /> SLOT (slotCheckFormData()) );<br /> connect( editDatabasePassword,<br /> SIGNAL (editingFinished()),<br /> this,<br /> SLOT (slotCheckFormData()) );<br /> connect( editDatabasePassword,<br /> SIGNAL (returnPressed()),<br /> this,<br /> SLOT (slotCheckFormData()) );


<br /> // creando la caja de botones<br /> buttons = new QDialogButtonBox( this );<br /> buttons-&gt;addButton( QDialogButtonBox::Ok );<br /> buttons-&gt;addButton( QDialogButtonBox::Cancel );<br /> QPushButton''' okButton = buttons-&gt;button( QDialogButtonBox::Ok );<br /> okButton-&gt;setText( tr( &quot;Connect!&quot; ) );<br /> okButton-&gt;setEnabled( false );<br /> connect( buttons,<br /> SIGNAL (accepted()),<br /> this,<br /> SLOT (slotPerformConnection()));<br /> connect( buttons,<br /> SIGNAL (rejected()),<br /> this,<br /> SLOT (close()));
// creando todos los gui components
labelDatabaseDriverName = new QLabel( tr("Database Type (driver name)"), this );
labelDatabasePort = new QLabel( tr("TCP/IP Port Number"), this );
labelDatabaseName = new QLabel( tr("Database Name"), this );
labelDatabaseHostName = new QLabel( tr("Host Name"), this );
labelDatabaseUsername = new QLabel( tr("Username"), this );
labelDatabasePassword = new QLabel( tr("Password"), this );
labelDatabaseURL = new QLabel( this );
labelDatabaseURL->setAlignment( Qt::AlignCenter );


// configurando margen vertical para mostrar los componentes<br /> QVBoxLayout* verticalLayout = new QVBoxLayout( this );
spinBoxDatabasePort = new QSpinBox( this );
spinBoxDatabasePort->setMaximum( 9999 );
spinBoxDatabasePort->setMinimum( 100 );
spinBoxDatabasePort->setSingleStep( 1 );


// create a grid layout to add all the components<br /> QGridLayout* formGridLayout = new QGridLayout( this );<br /> QGroupBox* gridGroupBox = new QGroupBox( this );<br /> gridGroupBox-&gt;setTitle( tr(&quot;Database connection properties&amp;quot; ) );<br /> formGridLayout-&gt;addWidget( labelDatabaseDriverName, 0, 0 );<br /> formGridLayout-&gt;addWidget( comboDatabaseDriverName, 0, 1 );<br /> labelDatabaseDriverName-&gt;setBuddy( comboDatabaseDriverName );<br /> formGridLayout-&gt;addWidget( labelDatabaseHostName, 1, 0 );<br /> formGridLayout-&gt;addWidget( editDatabaseHostName, 1, 1);<br /> labelDatabaseHostName-&gt;setBuddy( editDatabaseHostName );<br /> formGridLayout-&gt;addWidget( labelDatabasePort, 2, 0 );<br /> formGridLayout-&gt;addWidget( spinBoxDatabasePort, 2, 1 );<br /> labelDatabasePort-&gt;setBuddy( spinBoxDatabasePort );<br /> formGridLayout-&gt;addWidget( labelDatabaseName, 3, 0 );<br /> formGridLayout-&gt;addWidget( editDatabaseName , 3, 1 );<br /> labelDatabaseName-&gt;setBuddy( editDatabaseName );<br /> formGridLayout-&gt;addWidget( labelDatabaseUsername, 4, 0 );<br /> formGridLayout-&gt;addWidget( editDatabaseUsername, 4, 1 );<br /> labelDatabaseUsername-&gt;setBuddy( editDatabaseUsername );<br /> formGridLayout-&gt;addWidget( labelDatabasePassword, 5, 0 );<br /> formGridLayout-&gt;addWidget( editDatabasePassword, 5, 1 );<br /> labelDatabasePassword-&gt;setBuddy( editDatabasePassword );<br /> // agregar todos los elementos al groupbox<br /> gridGroupBox-&gt;setLayout( formGridLayout );
comboDatabaseDriverName = new QComboBox( this );
comboDatabaseDriverName->setEditable( false );


// agregando un nuevo groupbox que contenga la URL de la conexion<br /> QGroupBox* urlGroupBox = new QGroupBox( this );<br /> urlGroupBox-&gt;setTitle( tr( &quot;Database URL&amp;quot; ) );<br /> QHBoxLayout* urlLayout = new QHBoxLayout( this );<br /> urlLayout-&gt;addWidget( labelDatabaseURL );<br /> urlGroupBox-&gt;setLayout( urlLayout );


// todos los margenes juntos<br /> verticalLayout-&gt;addWidget( gridGroupBox );<br /> verticalLayout-&gt;addStretch();<br /> verticalLayout-&gt;addWidget( urlGroupBox );<br /> verticalLayout-&gt;addWidget( buttons );
editDatabaseName = new QLineEdit( this );
editDatabaseHostName = new QLineEdit( this );
editDatabaseUsername = new QLineEdit( this );
editDatabasePassword = new QLineEdit( this );
editDatabasePassword->setEchoMode( QLineEdit::Password );
connect( editDatabaseName,
SIGNAL (editingFinished()),
this,
SLOT (slotCheckFormData()) );
connect( editDatabaseHostName,
SIGNAL (editingFinished()),
this,
SLOT (slotCheckFormData()) );
connect( editDatabaseUsername,
SIGNAL (editingFinished()),
this,
SLOT (slotCheckFormData()) );
connect( editDatabasePassword,
SIGNAL (editingFinished()),
this,
SLOT (slotCheckFormData()) );
connect( editDatabasePassword,
SIGNAL (returnPressed()),
this,
SLOT (slotCheckFormData()) );


comboDatabaseDriverName-&gt;setFocus();<br />}


void DatabaseConnectionDialog::findAvailableDrivers()<br />{<br /> // eliminando todos los elementos<br /> comboDatabaseDriverName-&gt;clear();
// creando la caja de botones
buttons = new QDialogButtonBox( this );
buttons->addButton( QDialogButtonBox::Ok );
buttons->addButton( QDialogButtonBox::Cancel );
QPushButton''' okButton = buttons->button( QDialogButtonBox::Ok );
okButton->setText( tr( "Connect!" ) );
okButton->setEnabled( false );
connect( buttons,
SIGNAL (accepted()),
this,
SLOT (slotPerformConnection()));
connect( buttons,
SIGNAL (rejected()),
this,
SLOT (close()));


// rellenando el combo con los controladores disponibles<br /> foreach( QString driverName, QSqlDatabase::drivers() )<br /> comboDatabaseDriverName-&gt;addItem( driverName );<br />}
// configurando margen vertical para mostrar los componentes
QVBoxLayout* verticalLayout = new QVBoxLayout( this );


bool DatabaseConnectionDialog::slotCheckFormData()<br />{<br /> return checkFormData();<br />}
// create a grid layout to add all the components
QGridLayout* formGridLayout = new QGridLayout( this );
QGroupBox* gridGroupBox = new QGroupBox( this );
gridGroupBox->setTitle( tr("Database connection properties" ) );
formGridLayout->addWidget( labelDatabaseDriverName, 0, 0 );
formGridLayout->addWidget( comboDatabaseDriverName, 0, 1 );
labelDatabaseDriverName->setBuddy( comboDatabaseDriverName );
formGridLayout->addWidget( labelDatabaseHostName, 1, 0 );
formGridLayout->addWidget( editDatabaseHostName, 1, 1);
labelDatabaseHostName->setBuddy( editDatabaseHostName );
formGridLayout->addWidget( labelDatabasePort, 2, 0 );
formGridLayout->addWidget( spinBoxDatabasePort, 2, 1 );
labelDatabasePort->setBuddy( spinBoxDatabasePort );
formGridLayout->addWidget( labelDatabaseName, 3, 0 );
formGridLayout->addWidget( editDatabaseName , 3, 1 );
labelDatabaseName->setBuddy( editDatabaseName );
formGridLayout->addWidget( labelDatabaseUsername, 4, 0 );
formGridLayout->addWidget( editDatabaseUsername, 4, 1 );
labelDatabaseUsername->setBuddy( editDatabaseUsername );
formGridLayout->addWidget( labelDatabasePassword, 5, 0 );
formGridLayout->addWidget( editDatabasePassword, 5, 1 );
labelDatabasePassword->setBuddy( editDatabasePassword );
// agregar todos los elementos al groupbox
gridGroupBox->setLayout( formGridLayout );


bool DatabaseConnectionDialog::checkFormData(){<br /> if( editDatabaseName-&gt;text().isEmpty()<br /> || editDatabaseHostName-&gt;text().isEmpty()<br /> || editDatabaseUsername-&gt;text().isEmpty()<br /> || editDatabasePassword-&gt;text().isEmpty() )<br /> buttons-&gt;button( QDialogButtonBox::Ok )<s>&gt;setEnabled( false );<br /> else{<br /> // enable the connect button and give focus<br /> buttons</s>&gt;button( QDialogButtonBox::Ok )<s>&gt;setEnabled( true );<br /> buttons</s>&gt;button( QDialogButtonBox::Ok )<s>&gt;setFocus();<br /> }
// agregando un nuevo groupbox que contenga la URL de la conexion
QGroupBox* urlGroupBox = new QGroupBox( this );
urlGroupBox->setTitle( tr( "Database URL" ) );
QHBoxLayout* urlLayout = new QHBoxLayout( this );
urlLayout->addWidget( labelDatabaseURL );
urlGroupBox->setLayout( urlLayout );


<br /> // si la conexion se puede establecer (o al menos intentar)<br /> // mostrar la URL<br /> if( buttons</s>&gt;button( QDialogButtonBox::Ok )<s>&gt;isEnabled() )<br /> labelDatabaseURL</s>&gt;setText( comboDatabaseDriverName-&gt;currentText()<br /> + &quot;://&amp;quot;<br /> + editDatabaseUsername-&gt;text()<br /> + &quot;</code>&quot;<br /> + editDatabaseHostName-&gt;text()<br /> + &quot;/&amp;quot;<br /> + editDatabaseName-&gt;text() );<br /> else<br /> labelDatabaseURL-&gt;setText( &quot;&quot; );
// todos los margenes juntos
verticalLayout->addWidget( gridGroupBox );
verticalLayout->addStretch();
verticalLayout->addWidget( urlGroupBox );
verticalLayout->addWidget( buttons );


return buttons-&gt;button( QDialogButtonBox::Ok )<s>&gt;isEnabled();<br />}
comboDatabaseDriverName->setFocus();
<br />void DatabaseConnectionDialog::doDatabaseConnection()<br />{<br /> // chequear que el controlador de la base de datos esta realmente disponible<br /> // (no deberia suceder pero…)<br /> if( ! QSqlDatabase::isDriverAvailable( comboDatabaseDriverName</s>&gt;currentText() ) ){<br /> QMessageBox::critical( this,<br /> tr(&quot;Database Connection Error&amp;quot;),<br /> tr(&quot;Database driver not available!&quot;)<br /> );
}


return;<br /> }
void DatabaseConnectionDialog::findAvailableDrivers()
{
// eliminando todos los elementos
comboDatabaseDriverName->clear();


qDebug() &lt;&lt; &quot;Realizando la configuracion del controlador..&quot;;
// rellenando el combo con los controladores disponibles
foreach( QString driverName, QSqlDatabase::drivers() )
comboDatabaseDriverName->addItem( driverName );
}
 
bool DatabaseConnectionDialog::slotCheckFormData()
{
return checkFormData();
}
 
bool DatabaseConnectionDialog::checkFormData(){
if( editDatabaseName->text().isEmpty()
|| editDatabaseHostName->text().isEmpty()
|| editDatabaseUsername->text().isEmpty()
|| editDatabasePassword->text().isEmpty() )
buttons->button( QDialogButtonBox::Ok )->setEnabled( false );
else{
// enable the connect button and give focus
buttons->button( QDialogButtonBox::Ok )->setEnabled( true );
buttons->button( QDialogButtonBox::Ok )->setFocus();
}
 
 
// si la conexion se puede establecer (o al menos intentar)
// mostrar la URL
if( buttons->button( QDialogButtonBox::Ok )->isEnabled() )
labelDatabaseURL->setText( comboDatabaseDriverName->currentText()
+ "://"
+ editDatabaseUsername->text()
+ "@"
+ editDatabaseHostName->text()
+ "/"
+ editDatabaseName->text() );
else
labelDatabaseURL->setText( "" );


// configurar las propiedades del controlador<br /> QSqlDatabase databaseConnection = QSqlDatabase::addDatabase( comboDatabaseDriverName-&gt;currentText() );<br /> databaseConnection.setDatabaseName( editDatabaseName-&gt;text() );<br /> databaseConnection.setUserName( editDatabaseUsername-&gt;text() );<br /> databaseConnection.setHostName( editDatabaseHostName-&gt;text() );<br /> databaseConnection.setPassword( editDatabasePassword-&gt;text() );<br /> databaseConnection.setPort( spinBoxDatabasePort-&gt;text().toInt() );
return buttons->button( QDialogButtonBox::Ok )->isEnabled();
}


if( ! databaseConnection.open() ){<br /> QMessageBox::critical( this,<br /> tr(&quot;Database Connection Error&amp;quot;),<br /> databaseConnection.lastError().text()<br /> );
void DatabaseConnectionDialog::doDatabaseConnection()
{
// chequear que el controlador de la base de datos esta realmente disponible
// (no deberia suceder pero…)
if( ! QSqlDatabase::isDriverAvailable( comboDatabaseDriverName->currentText() ) ){
QMessageBox::critical( this,
tr("Database Connection Error"),
tr("Database driver not available!")
);


// deshabilitando el boton de conectar y situando el cursor<br /> // en el primer campo<br /> buttons-&gt;button( QDialogButtonBox::Ok )<s>&gt;setEnabled( false );<br /> editDatabaseHostName</s>&gt;setFocus();<br /> }<br /> else{<br /> // ocultar el dialog<br /> this-&gt;hide();
return;
}


// emitir la señal<br /> qDebug() &lt;&lt; &quot;Emitiendo la señal indicando la conexion satisfactoria con la base de datos!&quot;;<br /> emit databaseConnect( databaseConnection );<br /> }<br />}
qDebug() << "Realizando la configuracion del controlador..";


void DatabaseConnectionDialog::slotPerformConnection()<br />{<br /> // realizando otro chequeo contra los datos del usuario<br /> if( slotCheckFormData() )<br /> doDatabaseConnection();
// configurar las propiedades del controlador
QSqlDatabase databaseConnection = QSqlDatabase::addDatabase( comboDatabaseDriverName->currentText() );
databaseConnection.setDatabaseName( editDatabaseName->text() );
databaseConnection.setUserName( editDatabaseUsername->text() );
databaseConnection.setHostName( editDatabaseHostName->text() );
databaseConnection.setPassword( editDatabasePassword->text() );
databaseConnection.setPort( spinBoxDatabasePort->text().toInt() );


if( ! databaseConnection.open() ){
QMessageBox::critical( this,
tr("Database Connection Error"),
databaseConnection.lastError().text()
);
// deshabilitando el boton de conectar y situando el cursor
// en el primer campo
buttons->button( QDialogButtonBox::Ok )->setEnabled( false );
editDatabaseHostName->setFocus();
}
else{
// ocultar el dialog
this->hide();
// emitir la señal
qDebug() << "Emitiendo la señal indicando la conexion satisfactoria con la base de datos!";
emit databaseConnect( databaseConnection );
}
}
}


void DatabaseConnectionDialog::setDatabaseName(const QString &amp;dbName)<br />{<br /> editDatabaseName-&gt;setText( dbName );<br />}
void DatabaseConnectionDialog::slotPerformConnection()
{
// realizando otro chequeo contra los datos del usuario
if( slotCheckFormData() )
doDatabaseConnection();


void DatabaseConnectionDialog::setDatabasePortNumber(int &amp;portNumber)<br />{<br /> spinBoxDatabasePort-&gt;setValue( portNumber );<br />}
}


void DatabaseConnectionDialog::setDatabaseHostName(const QString &amp;hostname)<br />{<br /> editDatabaseHostName-&gt;setText( hostname );<br />}
void DatabaseConnectionDialog::setDatabaseName(const QString &amp;dbName)
{
editDatabaseName->setText( dbName );
}


void DatabaseConnectionDialog::setDatabaseUsername(const QString &amp;username)<br />{<br /> editDatabaseUsername-&gt;setText( username );<br />}
void DatabaseConnectionDialog::setDatabasePortNumber(int &amp;portNumber)
{
spinBoxDatabasePort->setValue( portNumber );
}


void DatabaseConnectionDialog::setDatabaseDriverName(const QString &amp;drvName)<br />{<br /> int index = comboDatabaseDriverName-&gt;findText( drvName );<br /> if( index &gt;= 0 )<br /> comboDatabaseDriverName-&gt;setCurrentIndex( index );<br />}
void DatabaseConnectionDialog::setDatabaseHostName(const QString &amp;hostname)
{
editDatabaseHostName->setText( hostname );
}


void DatabaseConnectionDialog::setDatabasePassword(const QString &amp;pwd)<br />{<br /> editDatabasePassword-&gt;setText( pwd );<br />}
void DatabaseConnectionDialog::setDatabaseUsername(const QString &amp;username)
{
editDatabaseUsername->setText( username );
}


void DatabaseConnectionDialog::run(bool autoConnect)<br />{<br /> bool statusOk = checkFormData();<br /> if( ! autoConnect || ! statusOk )<br /> exec&amp;amp;#40;&amp;#41;;<br /> else<br /> doDatabaseConnection();<br />}
void DatabaseConnectionDialog::setDatabaseDriverName(const QString &amp;drvName)
{
int index = comboDatabaseDriverName->findText( drvName );
if( index >= 0 )
comboDatabaseDriverName->setCurrentIndex( index );
}
 
void DatabaseConnectionDialog::setDatabasePassword(const QString &amp;pwd)
{
editDatabasePassword->setText( pwd );
}
 
void DatabaseConnectionDialog::run(bool autoConnect)
{
bool statusOk = checkFormData();
if( ! autoConnect || ! statusOk )
exec();
else
doDatabaseConnection();
}

Revision as of 10:22, 25 February 2015


Dialog de Conexión a Base de Datos

Este fragmento de código muestra cómo implementar un Dialog de base de datos en general que le pedirá al usuario propiedades generales de conexión de la base de datos (nombre de usuario, contraseña, nombre de host, etc.), Así como un combo con todos los controladores de base de datos disponible. El Dialog proporciona también una señal que pasara la conexión de base de datos (si está establecida) para que los componentes de terceros puedan utilizar dicha conexión.

Uso

El uso del Dialog vendria siendo algo asi:

DatabaseConnectionDialog* dialog = new DatabaseConnectionDialog(this);

// opcional: preparando los datos que mostraremos al usuario en un formulario auto-completado
 dialog->setDatabaseName( "mydb" );
 dialog->setDatabasePortNumber( 1234 );
 dialog->setDatabaseHostName( "localhost" );
 dialog->setDatabaseUsername( "luca" );
 dialog->setDatabaseDriverName( "QPSQL" );
 dialog->setDatabasePassword( "pwd" );

// habilitando el botón de conectar si todos los datos son correctos
 dialog->checkFormData();
 // contactando la signal del dialog con el slot donde usaremos la conexion
 connect( dialog,
 SIGNAL (databaseConnect(QSqlDatabase&amp;amp;)),
 this,
 SLOT (slotHandleNewDatabaseConnection(QSqlDatabase&amp;amp;)));

// mostramos el dialog (sin auto-conexion)
 dialog->run( false );

El dialog nos permite pre-inicializar los campos del formulario, asi como el modo de auto-conectar que hace que la conexión sea automática si todos los datos están en su lugar. Notemos que este dialog puede ser perfeccionado de varias formas, y representa además un punto de partida para una conexión a base de datos más específica.

Modo Auto-Conectar

Cuando el método

run()

se invoca puede especificarse el modo de autoconectar con el valor booleano de true. En este modo si todos los campos estan llenos el dialog inmediatamente intenta conectarse a la base de datos, y en caso de lograrlo transparente al usuario emite el signal.

En caso de que los datos del formulario no estén completos o la conexión no se pueda establecer el dialog se muestra nuevamente. Si el modo de autoconectar esta apagado (parámetro = false) el dialog siempre se mostrará.

Código de fuente

El siguiente código es del fichero de encabezado (header):

/*!
 * databasedialog.h
 */
#ifndef DATABASEDIALOG_H
#define DATABASEDIALOG_H

#include <QDialog>
#include <QLabel>
#include <QLineEdit>
#include <QComboBox>
#include <QSpinBox>
#include <QDialogButtonBox>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QGridLayout>
#include <QSqlDatabase>
#include <QString>
#include <QMessageBox>
#include <QDebug>
#include <QSqlError>
#include <QPushButton>
#include <QGroupBox>

class DatabaseConnectionDialog : public QDialog
{
 Q_OBJECT

private:

 /*!
 * La etiqueta para el driver de la base de datos.
 */
 QLabel''' labelDatabaseDriverName;

/*!
 * La etiqueta para el puerto TCP/IP que la base de datos
 * utiliza para las conexiones entrantes.
 */
 QLabel''' labelDatabasePort;

/*!
 * La etiqueta para el nombre de la base de datos.
 */
 QLabel''' labelDatabaseName;

/*!
 * La etiqueta para el nombre de la máquina.
 */
 QLabel''' labelDatabaseHostName;

/*!
 * La etiqueta para el nombre de usuario.
 */
 QLabel''' labelDatabaseUsername;

/*!
 * La etiqueta para la contraseña.
 */
 QLabel''' labelDatabasePassword;

/*!
 * Una etiqueta para mostrar la URL de la conexión
 * a la base de datos.
 */
 QLabel''' labelDatabaseURL;

/*!
 * El nombre de la base de datos a la que el
 * usuario desea conectarse.
 */
 QLineEdit''' editDatabaseName;

/*!
 * El nombre del servidor donde se encuentra la base
 * de datos.
 */
 QLineEdit''' editDatabaseHostName;

/*!
 * El puerto de escucha del servidor de base de datos.
 */
 QSpinBox''' spinBoxDatabasePort;

/*!
 * El usuario para la conexión a la base de datos.
 */
 QLineEdit''' editDatabaseUsername;

/*!
 * Para poner la contraseña de la conexión a la base de datos.
 */
 QLineEdit''' editDatabasePassword;

/*!
 * El combo desde donde el usuario puede seleccionar el
 * driver y tipo de base de datos.
 */
 QComboBox''' comboDatabaseDriverName;

/*!
 * Un Dialog para mostrar los botones de conexión
 * conectar/cancelar.
 */
 QDialogButtonBox''' buttons;

/*!
 * Un método para crear todos los componentes del dialog
 * y alinearlos correctamente.
 */
 void setUpGUI();

 /*!
 * Para buscar y generar el combo con los controladores disponibles
 * para establecer la conexión con la base de datos.
 */
 void findAvailableDrivers();


 /*!
 * Para realizar la conexión con la base de datos
 * y emitir la señal para que pueda ser usada por otros.
 */
 void doDatabaseConnection();

public:
 explicit DatabaseConnectionDialog(QWidget '''parent = 0);

 /*!
 * Para asignar el nombre de la base de datos.
 * dbName
 */
 void setDatabaseName( const QString&amp;amp; dbName );

 /*!
 * Para asignar el puerto de escucha del servidor de base de datos.
 * portNumber
 */
 void setDatabasePortNumber( int&amp;amp; portNumber );

 /*!
 * Para asignar el nombre del servidor (nombre mnemónico).
 * hostname
 */
 void setDatabaseHostName( const QString&amp;amp; hostname );

 /*!
 * Para asignar el usuario de conexion.
 * username
 */
 void setDatabaseUsername( const QString&amp;amp; username );

 /*!
 * Para seleccionar el nombre del controlador.
 * drvName (ademas del tipo de base de datos)
 */
 void setDatabaseDriverName( const QString&amp;amp; drvName );

 /*!
 * Para asignar la contraseña.
 * pwd
 */
 void setDatabasePassword( const QString&amp;amp; pwd );


 /*!
 * Realizar un chequeo contra los datos introducidos para habilitar/deshabilitar
 * el boton de conectar dependiendo del completado o no del formulario.
 '''true Devuelve verdadero si es satisfactoria la conexion
*/
 bool checkFormData();

/*!
 * Realiza la conexion o muestra al usuario el Dialog en caso
 * de no haber completado el llenado o no haber podido realizar la
 * conexion automatica.
 * autoConnect si es ''true'' intenta conectarse automaticamente
 * si los datos estan completos, o avisa al usuario de los datos faltantes
 * Si es ''false'' simplemente muestra el Dialog y espera.
 */
 void run( bool autoConnect );


signals:

 /*!
 * Pasa la conexion en caso de que sea satisfactoria
 * databaseConnection Objeto
 */
 void databaseConnect( QSqlDatabase&amp;amp; databaseConnection );

public slots:

 /*!
 * Chequea si el usuario ha entrado los datos suficientes
 * para intentar conectarse a la base de datos
 */
 bool slotCheckFormData();


 /*!
 * Realiza la conexion.
 */
 void slotPerformConnection();

};

#endif // DATABASEDIALOG_H

A continuación la implementación de la clase:

#include "databasedialog.h"

DatabaseConnectionDialog::DatabaseConnectionDialog(QWidget parent) :

QDialog(parent)

{

// este dialog es modal
setModal( true );
// titulo del dialog
setWindowTitle( tr("Conexion a base de datos") );
// seteando cada componente GUI
setUpGUI();
// cargando los controladores
findAvailableDrivers();

}

void DatabaseConnectionDialog::setUpGUI() {


// creando todos los gui components
labelDatabaseDriverName = new QLabel( tr("Database Type (driver name)"), this );
labelDatabasePort = new QLabel( tr("TCP/IP Port Number"), this );
labelDatabaseName = new QLabel( tr("Database Name"), this );
labelDatabaseHostName = new QLabel( tr("Host Name"), this );
labelDatabaseUsername = new QLabel( tr("Username"), this );
labelDatabasePassword = new QLabel( tr("Password"), this );
labelDatabaseURL = new QLabel( this );
labelDatabaseURL->setAlignment( Qt::AlignCenter );
spinBoxDatabasePort = new QSpinBox( this );
spinBoxDatabasePort->setMaximum( 9999 );
spinBoxDatabasePort->setMinimum( 100 );
spinBoxDatabasePort->setSingleStep( 1 );
comboDatabaseDriverName = new QComboBox( this );
comboDatabaseDriverName->setEditable( false );


editDatabaseName = new QLineEdit( this );
editDatabaseHostName = new QLineEdit( this );
editDatabaseUsername = new QLineEdit( this );
editDatabasePassword = new QLineEdit( this );
editDatabasePassword->setEchoMode( QLineEdit::Password );
connect( editDatabaseName,
SIGNAL (editingFinished()),
this,
SLOT (slotCheckFormData()) );
connect( editDatabaseHostName,
SIGNAL (editingFinished()),
this,
SLOT (slotCheckFormData()) );
connect( editDatabaseUsername,
SIGNAL (editingFinished()),
this,
SLOT (slotCheckFormData()) );
connect( editDatabasePassword,
SIGNAL (editingFinished()),
this,
SLOT (slotCheckFormData()) );
connect( editDatabasePassword,
SIGNAL (returnPressed()),
this,
SLOT (slotCheckFormData()) );


// creando la caja de botones
buttons = new QDialogButtonBox( this );
buttons->addButton( QDialogButtonBox::Ok );
buttons->addButton( QDialogButtonBox::Cancel );
QPushButton okButton = buttons->button( QDialogButtonBox::Ok );
okButton->setText( tr( "Connect!" ) );
okButton->setEnabled( false );
connect( buttons,
SIGNAL (accepted()),
this,
SLOT (slotPerformConnection()));
connect( buttons,
SIGNAL (rejected()),
this,
SLOT (close()));

// configurando margen vertical para mostrar los componentes

QVBoxLayout* verticalLayout = new QVBoxLayout( this );

// create a grid layout to add all the components

QGridLayout* formGridLayout = new QGridLayout( this );
QGroupBox* gridGroupBox = new QGroupBox( this );
gridGroupBox->setTitle( tr("Database connection properties" ) );
formGridLayout->addWidget( labelDatabaseDriverName, 0, 0 );
formGridLayout->addWidget( comboDatabaseDriverName, 0, 1 );
labelDatabaseDriverName->setBuddy( comboDatabaseDriverName );
formGridLayout->addWidget( labelDatabaseHostName, 1, 0 );
formGridLayout->addWidget( editDatabaseHostName, 1, 1);
labelDatabaseHostName->setBuddy( editDatabaseHostName );
formGridLayout->addWidget( labelDatabasePort, 2, 0 );
formGridLayout->addWidget( spinBoxDatabasePort, 2, 1 );
labelDatabasePort->setBuddy( spinBoxDatabasePort );
formGridLayout->addWidget( labelDatabaseName, 3, 0 );
formGridLayout->addWidget( editDatabaseName , 3, 1 );
labelDatabaseName->setBuddy( editDatabaseName );
formGridLayout->addWidget( labelDatabaseUsername, 4, 0 );
formGridLayout->addWidget( editDatabaseUsername, 4, 1 );
labelDatabaseUsername->setBuddy( editDatabaseUsername );
formGridLayout->addWidget( labelDatabasePassword, 5, 0 );
formGridLayout->addWidget( editDatabasePassword, 5, 1 );
labelDatabasePassword->setBuddy( editDatabasePassword );
// agregar todos los elementos al groupbox
gridGroupBox->setLayout( formGridLayout );

// agregando un nuevo groupbox que contenga la URL de la conexion

QGroupBox* urlGroupBox = new QGroupBox( this );
urlGroupBox->setTitle( tr( "Database URL" ) );
QHBoxLayout* urlLayout = new QHBoxLayout( this );
urlLayout->addWidget( labelDatabaseURL );
urlGroupBox->setLayout( urlLayout );

// todos los margenes juntos

verticalLayout->addWidget( gridGroupBox );
verticalLayout->addStretch();
verticalLayout->addWidget( urlGroupBox );
verticalLayout->addWidget( buttons );

comboDatabaseDriverName->setFocus(); }

void DatabaseConnectionDialog::findAvailableDrivers() {

// eliminando todos los elementos
comboDatabaseDriverName->clear();

// rellenando el combo con los controladores disponibles

foreach( QString driverName, QSqlDatabase::drivers() )
comboDatabaseDriverName->addItem( driverName );

}

bool DatabaseConnectionDialog::slotCheckFormData() {

return checkFormData();

}

bool DatabaseConnectionDialog::checkFormData(){

if( editDatabaseName->text().isEmpty()
|| editDatabaseHostName->text().isEmpty()
|| editDatabaseUsername->text().isEmpty()
|| editDatabasePassword->text().isEmpty() )
buttons->button( QDialogButtonBox::Ok )->setEnabled( false );
else{
// enable the connect button and give focus
buttons->button( QDialogButtonBox::Ok )->setEnabled( true );
buttons->button( QDialogButtonBox::Ok )->setFocus();
}


// si la conexion se puede establecer (o al menos intentar)
// mostrar la URL
if( buttons->button( QDialogButtonBox::Ok )->isEnabled() )
labelDatabaseURL->setText( comboDatabaseDriverName->currentText()
+ "://"
+ editDatabaseUsername->text()
+ "@"
+ editDatabaseHostName->text()
+ "/"
+ editDatabaseName->text() );
else
labelDatabaseURL->setText( "" );

return buttons->button( QDialogButtonBox::Ok )->isEnabled(); }

void DatabaseConnectionDialog::doDatabaseConnection() {

// chequear que el controlador de la base de datos esta realmente disponible
// (no deberia suceder pero…)
if( ! QSqlDatabase::isDriverAvailable( comboDatabaseDriverName->currentText() ) ){
QMessageBox::critical( this,
tr("Database Connection Error"),
tr("Database driver not available!")
);

return;

}

qDebug() << "Realizando la configuracion del controlador..";

// configurar las propiedades del controlador

QSqlDatabase databaseConnection = QSqlDatabase::addDatabase( comboDatabaseDriverName->currentText() );
databaseConnection.setDatabaseName( editDatabaseName->text() );
databaseConnection.setUserName( editDatabaseUsername->text() );
databaseConnection.setHostName( editDatabaseHostName->text() );
databaseConnection.setPassword( editDatabasePassword->text() );
databaseConnection.setPort( spinBoxDatabasePort->text().toInt() );

if( ! databaseConnection.open() ){

QMessageBox::critical( this,
tr("Database Connection Error"),
databaseConnection.lastError().text()
);

// deshabilitando el boton de conectar y situando el cursor

// en el primer campo
buttons->button( QDialogButtonBox::Ok )->setEnabled( false );
editDatabaseHostName->setFocus();
}
else{
// ocultar el dialog
this->hide();

// emitir la señal

qDebug() << "Emitiendo la señal indicando la conexion satisfactoria con la base de datos!";
emit databaseConnect( databaseConnection );
}

}

void DatabaseConnectionDialog::slotPerformConnection() {

// realizando otro chequeo contra los datos del usuario
if( slotCheckFormData() )
doDatabaseConnection();

}

void DatabaseConnectionDialog::setDatabaseName(const QString &dbName) {

editDatabaseName->setText( dbName );

}

void DatabaseConnectionDialog::setDatabasePortNumber(int &portNumber) {

spinBoxDatabasePort->setValue( portNumber );

}

void DatabaseConnectionDialog::setDatabaseHostName(const QString &hostname) {

editDatabaseHostName->setText( hostname );

}

void DatabaseConnectionDialog::setDatabaseUsername(const QString &username) {

editDatabaseUsername->setText( username );

}

void DatabaseConnectionDialog::setDatabaseDriverName(const QString &drvName) {

int index = comboDatabaseDriverName->findText( drvName );
if( index >= 0 )
comboDatabaseDriverName->setCurrentIndex( index );

}

void DatabaseConnectionDialog::setDatabasePassword(const QString &pwd) {

editDatabasePassword->setText( pwd );

}

void DatabaseConnectionDialog::run(bool autoConnect) {

bool statusOk = checkFormData();
if( ! autoConnect || ! statusOk )
exec();
else
doDatabaseConnection();

}