2017-10-17 3 views
0

this linkの後にユーザーログインページを作成しようとしています。これは私のヘッダファイルformlogin.hです:Qt5 - ログインページの作成中に "未定義の参照"エラーが発生しました

#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 

そして、これは私の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); 
} 

そして、これは私がログインページを実行しようとしている方法です:

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

しかし、すべてのこのエラーが発生する時刻:

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

しかし、まだ同じエラー:私はし

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

を設定しようとしています。私はオンラインで検索し、この問題のいくつかの修正を見ました。しかし、誰も私のために働いていません。私はすでにQ_OBJECTを私のクラスに入れました。すでにデフォルトのQWidget* parentの値を0に設定していますが、何も動作していないようです。

どのように私はこれを進めるべきですか?

ありがとうございます。

+0

"#include" formlogin.h ""は何ですか?最初のコード部分を意味しますか? – Alex

+0

@Alex、はい。最初のコード部分。 – John

+0

@John cppでデフォルトの引数( '= 0')を繰り返さないでください。それは動作しませんが、少なくともエラーが発生しやすいです。 –

答えて

0

これはリンカーの問題のようです。それをコンパイルしてリンクするメイクファイルがありますか?これを使わないでmakeを実行すると、リンクするものはわかりません。リンカは、main.cpp、formlogin.cpp、およびformlogin.hでmocを実行することによって生成されたcppのオブジェクトファイルをリンクする必要があります.Froggatt氏によると、.proファイルを使用すると、makefileを生成する最も簡単な方法ですこのすべてをやってください。

+0

ええ、私はメークファイルを持っていて、そこに何もリンクしていません。私はそこにファイルへの参照を追加し、再度試してみます。ありがとう。 – John

+0

はい、メイクファイルリストにcppファイルを追加した後、それは完全に機能しました。 – John

関連する問題