Difference between revisions of "User Login Dialog"

From Qt Wiki
Jump to: navigation, search
Line 1: Line 1:
[[Category:HowTo]]<br />[[Category:snippets]]
+
[[Category:HowTo]]
 +
[[Category:snippets]]
  
 
= An example of user login dialog =
 
= An example of user login dialog =
  
This code snippets shows how to implement a simple dialog window that allows the user to enter his username and password in order to make a login attempt. The dialog window will emit a signal in order to notify a listener for the login credentials. The login dialog can also presents a list of usernames to select one from.<br />The dialog also allows for the proposal of a specified username/password as it could be loaded from a settings or a configuration file.
+
This code snippets shows how to implement a simple dialog window that allows the user to enter his username and password in order to make a login attempt. The dialog window will emit a signal in order to notify a listener for the login credentials. The login dialog can also presents a list of usernames to select one from.
 +
The dialog also allows for the proposal of a specified username/password as it could be loaded from a settings or a configuration file.
  
 
== Header file ==
 
== Header file ==
  
<code><br />#include &lt;QDialog&amp;gt;<br />#include &lt;QLabel&amp;gt;<br />#include &lt;QPushButton&amp;gt;<br />#include &lt;QDialogButtonBox&amp;gt;<br />#include &lt;QLineEdit&amp;gt;<br />#include &lt;QComboBox&amp;gt;<br />#include &lt;QGridLayout&amp;gt;<br />#include &lt;QStringList&amp;gt;<br />#include &lt;QDebug&amp;gt;
+
<code>
 +
#include <QDialog>
 +
#include <QLabel>
 +
#include <QPushButton>
 +
#include <QDialogButtonBox>
 +
#include <QLineEdit>
 +
#include <QComboBox>
 +
#include <QGridLayout>
 +
#include <QStringList>
 +
#include <QDebug>
  
/*!<br /> '''Makes class LoginDialog a child to its parent, QDialog<br />'''/<br />class LoginDialog : public QDialog<br />{<br />/*!<br /> '''Turns Login Dialog into a QObject<br />'''/<br /> Q_OBJECT
+
/*!
 +
'''Makes class LoginDialog a child to its parent, QDialog
 +
*/
 +
class LoginDialog : public QDialog
 +
{
 +
/*!
 +
'''Turns Login Dialog into a QObject
 +
*/
 +
Q_OBJECT
  
private:<br /> /*!<br /> * A label for the username component.<br /> '''/<br /> QLabel''' labelUsername;
+
private:
 +
/*!
 +
* A label for the username component.
 +
*/
 +
QLabel''' labelUsername;
  
/*!<br /> * A label for the password.<br /> '''/<br /> QLabel''' labelPassword;
+
/*!
 +
* A label for the password.
 +
*/
 +
QLabel''' labelPassword;
  
/*!<br /> * An editable combo box for allowing the user<br /> * to enter his username or select it from a list.<br /> '''/<br /> QComboBox''' comboUsername;
+
/*!
 +
* An editable combo box for allowing the user
 +
* to enter his username or select it from a list.
 +
*/
 +
QComboBox''' comboUsername;
  
/*!<br /> * A field to let the user enters his password.<br /> '''/<br /> QLineEdit''' editPassword;
+
/*!
 +
* A field to let the user enters his password.
 +
*/
 +
QLineEdit''' editPassword;
  
/*!<br /> * The standard dialog button box.<br /> '''/<br /> QDialogButtonBox''' buttons;
+
/*!
 +
* The standard dialog button box.
 +
*/
 +
QDialogButtonBox''' buttons;
  
/*!<br /> * A method to set up all dialog components and<br /> * initialize them.<br /> */<br /> void setUpGUI();
+
/*!
 +
* A method to set up all dialog components and
 +
* initialize them.
 +
*/
 +
void setUpGUI();
  
public:<br /> explicit LoginDialog(QWidget '''parent = 0);
+
public:
<br /> /'''!<br /> * Sets the proposed username, that can come for instance<br /> * from a shared setting.<br /> '''username the string that represents the current username<br />''' to display<br /> '''/<br /> void setUsername( QString&amp;amp; username );
+
explicit LoginDialog(QWidget '''parent = 0);
<br /> /'''!<br /> * Sets the current password to propose to the user for the login.<br /> * password the password to fill into the dialog form<br /> '''/<br /> void setPassword( QString&amp;amp; password );
+
 
<br /> /'''!<br /> * Sets a list of allowed usernames from which the user<br /> * can pick one if he does not want to directly edit it.<br /> '''usernames a list of usernames<br />'''/<br /> void setUsernamesList( const QStringList&amp;amp; usernames );
+
/*!
 +
* Sets the proposed username, that can come for instance
 +
* from a shared setting.
 +
'''username the string that represents the current username
 +
''' to display
 +
*/
 +
void setUsername( QString&amp;amp; username );
 +
 
 +
/*!
 +
* Sets the current password to propose to the user for the login.
 +
* password the password to fill into the dialog form
 +
*/
 +
void setPassword( QString&amp;amp; password );
 +
 
 +
/*!
 +
* Sets a list of allowed usernames from which the user
 +
* can pick one if he does not want to directly edit it.
 +
'''usernames a list of usernames
 +
*/
 +
void setUsernamesList( const QStringList&amp;amp; usernames );
  
 
signals:
 
signals:
  
/*!<br /> * A signal emitted when the login is performed.<br /> * username the username entered in the dialog<br /> * password the password entered in the dialog<br /> * index the number of the username selected in the combobox<br /> '''/<br /> void acceptLogin( QString&amp;amp; username, QString&amp;amp; password, int&amp;amp; indexNumber );
+
/*!
<br />public slots:<br /> /'''!<br /> * A lot to adjust the emitting of the signal.<br /> */<br /> void slotAcceptLogin();
+
* A signal emitted when the login is performed.
 +
* username the username entered in the dialog
 +
* password the password entered in the dialog
 +
* index the number of the username selected in the combobox
 +
*/
 +
void acceptLogin( QString&amp;amp; username, QString&amp;amp; password, int&amp;amp; indexNumber );
 +
 
 +
public slots:
 +
/*!
 +
* A lot to adjust the emitting of the signal.
 +
*/
 +
void slotAcceptLogin();
  
 
};
 
};
Line 39: Line 109:
 
== Implementation ==
 
== Implementation ==
  
<code>LoginDialog::LoginDialog(QWidget '''parent) :<br /> QDialog(parent)<br />{<br /> setUpGUI();<br /> setWindowTitle( tr(&quot;User Login&amp;quot;) );<br /> setModal( true );<br />}
+
<code>LoginDialog::LoginDialog(QWidget '''parent) :
<br />void LoginDialog::setUpGUI(){<br /> // set up the layout<br /> QGridLayout''' formGridLayout = new QGridLayout( this );
+
QDialog(parent)
 +
{
 +
setUpGUI();
 +
setWindowTitle( tr("User Login") );
 +
setModal( true );
 +
}
  
// initialize the username combo box so that it is editable<br /> comboUsername = new QComboBox( this );<br /> comboUsername-&gt;setEditable( true );<br /> // initialize the password field so that it does not echo<br /> // characters<br /> editPassword = new QLineEdit( this );<br /> editPassword-&gt;setEchoMode( QLineEdit::Password );
+
void LoginDialog::setUpGUI(){
 +
// set up the layout
 +
QGridLayout''' formGridLayout = new QGridLayout( this );
  
// initialize the labels<br /> labelUsername = new QLabel( this );<br /> labelPassword = new QLabel( this );<br /> labelUsername-&gt;setText( tr( &quot;Username&amp;quot; ) );<br /> labelUsername-&gt;setBuddy( comboUsername );<br /> labelPassword-&gt;setText( tr( &quot;Password&amp;quot; ) );<br /> labelPassword-&gt;setBuddy( editPassword );
+
// initialize the username combo box so that it is editable
 +
comboUsername = new QComboBox( this );
 +
comboUsername->setEditable( true );
 +
// initialize the password field so that it does not echo
 +
// characters
 +
editPassword = new QLineEdit( this );
 +
editPassword->setEchoMode( QLineEdit::Password );
  
// initialize buttons<br /> buttons = new QDialogButtonBox( this );<br /> buttons-&gt;addButton( QDialogButtonBox::Ok );<br /> buttons-&gt;addButton( QDialogButtonBox::Cancel );<br /> buttons-&gt;button( QDialogButtonBox::Ok )<s>&gt;setText( tr(&quot;Login&amp;quot;) );<br /> buttons</s>&gt;button( QDialogButtonBox::Cancel )<s>&gt;setText( tr(&quot;Abort&amp;quot;) );
+
// initialize the labels
<br /> // connects slots<br /> connect( buttons</s>&gt;button( QDialogButtonBox::Cancel ),<br /> SIGNAL (clicked()),<br /> this,<br /> SLOT (close())<br /> );
+
labelUsername = new QLabel( this );
 +
labelPassword = new QLabel( this );
 +
labelUsername->setText( tr( "Username" ) );
 +
labelUsername->setBuddy( comboUsername );
 +
labelPassword->setText( tr( "Password" ) );
 +
labelPassword->setBuddy( editPassword );
  
connect( buttons-&gt;button( QDialogButtonBox::Ok ),<br /> SIGNAL (clicked()),<br /> this,<br /> SLOT (slotAcceptLogin()) );
+
// initialize buttons
 +
buttons = new QDialogButtonBox( this );
 +
buttons->addButton( QDialogButtonBox::Ok );
 +
buttons->addButton( QDialogButtonBox::Cancel );
 +
buttons->button( QDialogButtonBox::Ok )->setText( tr("Login") );
 +
buttons->button( QDialogButtonBox::Cancel )->setText( tr("Abort") );
  
// place components into the dialog<br /> formGridLayout-&gt;addWidget( labelUsername, 0, 0 );<br /> formGridLayout-&gt;addWidget( comboUsername, 0, 1 );<br /> formGridLayout-&gt;addWidget( labelPassword, 1, 0 );<br /> formGridLayout-&gt;addWidget( editPassword, 1, 1 );<br /> formGridLayout-&gt;addWidget( buttons, 2, 0, 1, 2 );
+
// connects slots
 +
connect( buttons->button( QDialogButtonBox::Cancel ),
 +
SIGNAL (clicked()),
 +
this,
 +
SLOT (close())
 +
);
 +
 
 +
connect( buttons->button( QDialogButtonBox::Ok ),
 +
SIGNAL (clicked()),
 +
this,
 +
SLOT (slotAcceptLogin()) );
 +
 
 +
// place components into the dialog
 +
formGridLayout->addWidget( labelUsername, 0, 0 );
 +
formGridLayout->addWidget( comboUsername, 0, 1 );
 +
formGridLayout->addWidget( labelPassword, 1, 0 );
 +
formGridLayout->addWidget( editPassword, 1, 1 );
 +
formGridLayout->addWidget( buttons, 2, 0, 1, 2 );
  
 
setLayout( formGridLayout );
 
setLayout( formGridLayout );
Line 57: Line 167:
 
}
 
}
  
void LoginDialog::setUsername(QString &amp;username){<br /> bool found = false;<br /> for( int i = 0; i &lt; comboUsername-&gt;count() &amp;&amp; ! found ; i++ )<br /> if( comboUsername-&gt;itemText( i ) == username ){<br /> comboUsername-&gt;setCurrentIndex( i );<br /> found = true;<br /> }
+
void LoginDialog::setUsername(QString &amp;username){
 +
bool found = false;
 +
for( int i = 0; i < comboUsername->count() &amp;&amp; ! found ; i++ )
 +
if( comboUsername->itemText( i ) == username ){
 +
comboUsername->setCurrentIndex( i );
 +
found = true;
 +
}
  
if( ! found ){<br /> int index = comboUsername-&gt;count();<br /> qDebug() &lt;&lt; &quot;Select username &quot; &lt;&lt; index;<br /> comboUsername-&gt;addItem( username );
+
if( ! found ){
 +
int index = comboUsername->count();
 +
qDebug() << "Select username " << index;
 +
comboUsername->addItem( username );
  
comboUsername-&gt;setCurrentIndex( index );<br /> }
+
comboUsername->setCurrentIndex( index );
 +
}
  
// place the focus on the password field<br /> editPassword-&gt;setFocus();<br />}
+
// place the focus on the password field
 +
editPassword->setFocus();
 +
}
  
void LoginDialog::setPassword(QString &amp;password){<br /> editPassword-&gt;setText( password );<br />}
+
void LoginDialog::setPassword(QString &amp;password){
 +
editPassword->setText( password );
 +
}
  
void LoginDialog::slotAcceptLogin(){<br /> QString username = comboUsername-&gt;currentText();<br /> QString password = editPassword-&gt;text();<br /> int index = comboUsername-&gt;currentIndex();
+
void LoginDialog::slotAcceptLogin(){
 +
QString username = comboUsername->currentText();
 +
QString password = editPassword->text();
 +
int index = comboUsername->currentIndex();
  
emit acceptLogin( username, // current username<br /> password, // current password<br /> index // index in the username list<br /> );
+
emit acceptLogin( username, // current username
 +
password, // current password
 +
index // index in the username list
 +
);
  
// close this dialog<br /> close();<br />}
+
// close this dialog
 +
close();
 +
}
  
void LoginDialog::setUsernamesList(const QStringList &amp;usernames){<br /> comboUsername-&gt;addItems( usernames );<br />}
+
void LoginDialog::setUsernamesList(const QStringList &amp;usernames){
 +
comboUsername->addItems( usernames );
 +
}
  
 
</code>
 
</code>
Line 79: Line 213:
 
== Usage example ==
 
== Usage example ==
  
<code>LoginDialog* loginDialog = new LoginDialog( this );<br />loginDialog-&gt;setUsername( &quot;Luca&amp;quot; ); // optional<br />connect( loginDialog,<br /> SIGNAL (acceptLogin(QString&amp;amp;,QString&amp;amp;,int&amp;amp;)),<br /> this,<br /> SLOT (slotAcceptUserLogin(QString&amp;amp;,QString&amp;amp;)));<br />loginDialog-&gt;exec&amp;amp;#40;&amp;#41;;
+
<code>LoginDialog* loginDialog = new LoginDialog( this );
 +
loginDialog->setUsername( "Luca" ); // optional
 +
connect( loginDialog,
 +
SIGNAL (acceptLogin(QString&amp;amp;,QString&amp;amp;,int&amp;amp;)),
 +
this,
 +
SLOT (slotAcceptUserLogin(QString&amp;amp;,QString&amp;amp;)));
 +
loginDialog->exec();
  
 
</code>
 
</code>

Revision as of 08:57, 25 February 2015


An example of user login dialog

This code snippets shows how to implement a simple dialog window that allows the user to enter his username and password in order to make a login attempt. The dialog window will emit a signal in order to notify a listener for the login credentials. The login dialog can also presents a list of usernames to select one from. The dialog also allows for the proposal of a specified username/password as it could be loaded from a settings or a configuration file.

Header file

  1. include <QDialog>
  2. include <QLabel>
  3. include <QPushButton>
  4. include <QDialogButtonBox>
  5. include <QLineEdit>
  6. include <QComboBox>
  7. include <QGridLayout>
  8. include <QStringList>
  9. include <QDebug>

/*!

Makes class LoginDialog a child to its parent, QDialog
  • /

class LoginDialog : public QDialog { /*!

Turns Login Dialog into a QObject
  • /
Q_OBJECT

private:

/*!
* A label for the username component.
*/
QLabel labelUsername;

/*!

* A label for the password.
*/
QLabel labelPassword;

/*!

* An editable combo box for allowing the user
* to enter his username or select it from a list.
*/
QComboBox comboUsername;

/*!

* A field to let the user enters his password.
*/
QLineEdit editPassword;

/*!

* The standard dialog button box.
*/
QDialogButtonBox buttons;

/*!

* A method to set up all dialog components and
* initialize them.
*/
void setUpGUI();

public:

explicit LoginDialog(QWidget parent = 0);
/*!
* Sets the proposed username, that can come for instance
* from a shared setting.
username the string that represents the current username

to display

*/
void setUsername( QString&amp; username );
/*!
* Sets the current password to propose to the user for the login.
* password the password to fill into the dialog form
*/
void setPassword( QString&amp; password );
/*!
* Sets a list of allowed usernames from which the user
* can pick one if he does not want to directly edit it.
usernames a list of usernames
  • /
void setUsernamesList( const QStringList&amp; usernames );

signals:

/*!

* A signal emitted when the login is performed.
* username the username entered in the dialog
* password the password entered in the dialog
* index the number of the username selected in the combobox
*/
void acceptLogin( QString&amp; username, QString&amp; password, int&amp; indexNumber );

public slots:

/*!
* A lot to adjust the emitting of the signal.
*/
void slotAcceptLogin();

};

  1. endif // LOGINDIALOG_H

Implementation

LoginDialog::LoginDialog(QWidget parent) :

QDialog(parent)

{

setUpGUI();
setWindowTitle( tr("User Login") );
setModal( true );

}

void LoginDialog::setUpGUI(){

// set up the layout
QGridLayout formGridLayout = new QGridLayout( this );

// initialize the username combo box so that it is editable

comboUsername = new QComboBox( this );
comboUsername->setEditable( true );
// initialize the password field so that it does not echo
// characters
editPassword = new QLineEdit( this );
editPassword->setEchoMode( QLineEdit::Password );

// initialize the labels

labelUsername = new QLabel( this );
labelPassword = new QLabel( this );
labelUsername->setText( tr( "Username" ) );
labelUsername->setBuddy( comboUsername );
labelPassword->setText( tr( "Password" ) );
labelPassword->setBuddy( editPassword );

// initialize buttons

buttons = new QDialogButtonBox( this );
buttons->addButton( QDialogButtonBox::Ok );
buttons->addButton( QDialogButtonBox::Cancel );
buttons->button( QDialogButtonBox::Ok )->setText( tr("Login") );
buttons->button( QDialogButtonBox::Cancel )->setText( tr("Abort") );
// connects slots
connect( buttons->button( QDialogButtonBox::Cancel ),
SIGNAL (clicked()),
this,
SLOT (close())
);

connect( buttons->button( QDialogButtonBox::Ok ),

SIGNAL (clicked()),
this,
SLOT (slotAcceptLogin()) );

// place components into the dialog

formGridLayout->addWidget( labelUsername, 0, 0 );
formGridLayout->addWidget( comboUsername, 0, 1 );
formGridLayout->addWidget( labelPassword, 1, 0 );
formGridLayout->addWidget( editPassword, 1, 1 );
formGridLayout->addWidget( buttons, 2, 0, 1, 2 );

setLayout( formGridLayout );

}

void LoginDialog::setUsername(QString &username){

bool found = false;
for( int i = 0; i < comboUsername->count() && ! found ; i++ )
if( comboUsername->itemText( i ) == username ){
comboUsername->setCurrentIndex( i );
found = true;
}

if( ! found ){

int index = comboUsername->count();
qDebug() << "Select username " << index;
comboUsername->addItem( username );

comboUsername->setCurrentIndex( index );

}

// place the focus on the password field

editPassword->setFocus();

}

void LoginDialog::setPassword(QString &password){

editPassword->setText( password );

}

void LoginDialog::slotAcceptLogin(){

QString username = comboUsername->currentText();
QString password = editPassword->text();
int index = comboUsername->currentIndex();

emit acceptLogin( username, // current username

password, // current password
index // index in the username list
);

// close this dialog

close();

}

void LoginDialog::setUsernamesList(const QStringList &usernames){

comboUsername->addItems( usernames );

}

Usage example

LoginDialog* loginDialog = new LoginDialog( this ); loginDialog->setUsername( "Luca" ); // optional connect( loginDialog,

SIGNAL (acceptLogin(QString&amp;,QString&amp;,int&amp;)),
this,
SLOT (slotAcceptUserLogin(QString&amp;,QString&amp;)));

loginDialog->exec();