2017-10-17 2 views
0

Je suis en train de créer une page de connexion utilisateur suivante this link. Ceci est mon fichier d'en-tête formlogin.h:Qt5 - erreur "référence non définie" lors de la tentative de création d'une page de connexion

#ifndef FORMLOGIN_H 
#define FORMLOGIN_H 

#include <QDialog> 
#include <QLabel> 
#include <QPushButton> 
#include <QDialogButtonBox> 
#include <QLineEdit> 
#include <QComboBox> 
#include <QGridLayout> 
#include <QStringList> 
#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& 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& 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& 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& username, QString& password, int& indexNumber); 

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

}; 

#endif // LOGINDIALOG_H 

Et voici mon fichier cpp:

#include "formlogin.h" 

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); 
} 

Et voilà comment je suis en train d'exécuter la page de connexion:

LoginDialog* loginDialog = new LoginDialog(m_mainWindow); 
connect(loginDialog, SIGNAL(acceptLogin(QString&,QString&,int&)), m_mainWindow, SLOT(slotAcceptUserLogin(QString&,QString&))); 
loginDialog->exec(); 

Mais chaque temps j'obtiens cette erreur:

undefined reference to `LoginDialog::LoginDialog(QWidget*)' 
collect2: error: ld returned 1 exit status 

J'ai essayé de placer le

LoginDialog::LoginDialog(QWidget* parent) : 
QDialog(parent) 

Pour:

LoginDialog::LoginDialog(QWidget* parent=0) : 
QDialog(parent) 

Mais toujours la même erreur. J'ai cherché en ligne et j'ai vu plusieurs corrections pour ce problème. Mais aucun n'a travaillé pour moi. J'ai déjà mis Q_OBJECT dans ma classe. Déjà défini la valeur par défaut QWidget* parent à 0, mais rien ne semblait fonctionner.

Une idée de comment je devrais procéder avec cela?

Merci d'avance.

+0

Qu'est ce que le "#include" formlogin.h ""? Voulez-vous dire la première partie du code? – Alex

+0

@Alex, oui. La première partie du code. – John

+0

@John Ne répétez pas l'argument par défaut ('= 0') dans le cpp. Ce n'est pas que ça ne marcherait pas, mais c'est au moins une erreur. –

Répondre

0

Cela ressemble à un problème d'éditeur de liens. Avez-vous un makefile pour le compiler et le lier? Si vous venez de faire make sans cela, il ne saura pas quoi lier. L'éditeur de liens devra lier les fichiers objet pour main.cpp, formlogin.cpp et le cpp généré en exécutant moc sur formlogin.h - comme le dit Froggatt, l'utilisation d'un fichier .pro est le moyen le plus simple de générer un fichier makefile pour vous fais tout ça.

+0

umm, oui j'ai un makefile et je n'ai rien lié là-bas. Je vais ajouter la référence au fichier là-bas et essayer à nouveau. Merci. – John

+0

Oui, après avoir ajouté le fichier cpp à la liste makefile, cela a fonctionné parfaitement. – John