我测试《精通Qt4编程》第二章“对话框QDialog"的第一个例子,就是一个验证用户密码是否正确的对话框程序。我按照源码输入,在命令行下qmake -project;qmake;make;构建正确,程序正常运行。
但是我用vim总不利索,决定用kdevelop4开发,初始测试第一章的helloworld程序正常,于是测试上述程序。创建对应的QtGui工程后,在kdevelop中工程侧栏中自动生成的两个不必要的源文件,重新创建新类(新类名为CLoginDlg,继承自QDialog),尝试过创建时从选择QDialog public继承,并在函数重写中勾选相应的需要复写的函数,然后按照书中代码完成相应源文件。
最后构建,却总是出现错误
代码: 全选
Linking CXX executable loginTest2
CMakeFiles/loginTest2.dir/main.cpp.o: In function `main':
/home/uli/Project/qt/loginTest2/main.cpp:11: undefined reference to `CLoginDlg::CLoginDlg(QWidget*)'
CMakeFiles/loginTest2.dir/main.cpp.o: In function `~CLoginDlg':
/home/uli/Project/qt/loginTest2/clogindlg.h:27: undefined reference to `vtable for CLoginDlg'
/home/uli/Project/qt/loginTest2/clogindlg.h:27: undefined reference to `vtable for CLoginDlg'
collect2: ld returned 1 exit status
make[2]: *** [loginTest2] Error 1
make[1]: *** [CMakeFiles/loginTest2.dir/all] Error 2
make: *** [all] Error 2
*** 失败 ***
kdevelop使用的是cmake构建程序,我成功用它构建了第一章的例子,在这里却出错了,谁用过kdevelop的能告诉我要怎么做???
万分感谢!
附上三个源程序代码:
clogindlg.h
代码: 全选
#ifndef CLOGINDLG_H
#define CLOGINDLG_H
#include <QtGui/QDialog>
class QLineEdit;
class CLoginDlg : public QDialog
{
Q_OBJECT
public:
CLoginDlg(QWidget* parent = 0);
public slots:
virtual void accept();
private:
QLineEdit* usrLineEdit;
QLineEdit* pwdLineEdit;
};
#endif // CLOGINDLG_H
代码: 全选
#include "clogindlg.h"
#include <QtGui/QtGui>
CLoginDlg::CLoginDlg(QWidget* parent ): QDialog(parent)
{
QLabel* usrLabel = new QLabel(tr("用户名:"));
QLabel* pwdLabel = new QLabel(tr("密码:"));
usrLineEdit = new QLineEdit;
pwdLineEdit = new QLineEdit;
pwdLineEdit->setEchoMode(QLineEdit::Password);
QGridLayout* gridLayout = new QGridLayout;
gridLayout->addWidget(usrLabel,0,0,1,1);
gridLayout->addWidget(usrLineEdit,0,1,1,3);
gridLayout->addWidget(pwdLabel,1,0,1,1);
gridLayout->addWidget(pwdLineEdit,1,1,1,3);
QPushButton* okBtn = new QPushButton(tr("确定"));
QPushButton* cancelBtn = new QPushButton(tr("取消"));
QHBoxLayout* btnLayout = new QHBoxLayout;
btnLayout->setSpacing(60);
btnLayout->addWidget(okBtn);
btnLayout->addWidget(cancelBtn);
QVBoxLayout* dlgLayout = new QVBoxLayout;
dlgLayout->setMargin(40);
dlgLayout->addLayout(gridLayout);
dlgLayout->addStretch(40);
dlgLayout->addLayout(btnLayout);
setLayout(dlgLayout);
connect(okBtn,SIGNAL(clicked()),this,SLOT(accept()));
connect(cancelBtn,SIGNAL(clicked()),this,SLOT(reject()));
setWindowTitle(tr("登录"));
resize(300,200);
}
void CLoginDlg::accept()
{
if(usrLineEdit->text().trimmed() == tr("lcf")
&& pwdLineEdit->text() == tr ("lcf"))
{
QDialog::accept();
}
else
{
QMessageBox::warning(this,tr("警告"),tr("用户或密码错误!"),
QMessageBox::Yes);
usrLineEdit->setFocus();
}
}
main.cpp
代码: 全选
#include <QtGui/QtGui>
#include <QtGui/QApplication>
#include "clogindlg.h"
int main(int argc, char** argv)
{
QApplication app(argc, argv);
QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8"));
CLoginDlg dlg;
return dlg.exec();
}