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に設定していますが、何も動作していないようです。
どのように私はこれを進めるべきですか?
ありがとうございます。
"#include" formlogin.h ""は何ですか?最初のコード部分を意味しますか? – Alex
@Alex、はい。最初のコード部分。 – John
@John cppでデフォルトの引数( '= 0')を繰り返さないでください。それは動作しませんが、少なくともエラーが発生しやすいです。 –