我正在使用 Qt创建者制作一个小GUI程序,但我遇到了两个“未解析的外部”错误。以下是我的所有代码: (顺便说一下,我按照 C ++ GUI编程与Qt4 ,第二版一书。这将在第2章中介绍)
我总共得到了五个文件: (代码有点长,所以你可以跳过一些,直接到最后解释。)
首先, mainwindow.h :
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
finddialog.h :
#ifndef FINDDIALOG_H
#define FINDDIALOG_H
#include<QDialog>
class QCheckBox;
class QLabel;
class QLineEdit;
class QPushButton;
class FindDialog:public QDialog
{
Q_OBJECT
public:
FindDialog(QWidget* parent=0);
signals:
void findNext(const QString &str,Qt::CaseSensitivity cs);
void findPrevious(const QString &str,Qt::CaseSensitivity cs);
private slots:
void findClicked();
void enableFindbuton(const QString& text);
private:
QLabel* label;
QLineEdit* lineEdit;
QCheckBox* caseCheckBox;
QCheckBox* backwardCheckBox;
QPushButton* findButton;
QPushButton* closeButton;
};
#endif
finddialog.cpp:
#include<QtGui>
#include"finddialog.h"
FindDialog::FindDialog(QWidget* parent=0):QDialog(parent=0)
{
label=new QLabel(tr("Find %what"));
lineEdit=new lineEdit;
label->setBuddy(lineEdit);
caseCheckBox=new QCheckBox(tr("Match &case"));
backwardCheckBox=new QCheckBox(tr("search &backward"));
findButton=new QPushButton("&Find");
findButton->setDefault(true);
findButton->setDefault(false);
closeButton=new QPushButton(tr("close"));
connect(lineEdit,SIGNAL(textchanged(const QString &)),
this,SLOT(enableFindbuton(const QString &));
connect(findButton,SIGNAL(clicked()),
this,SLOT(findClicked());
connect(closeButton,SIGNAL(clicked()),
this,SLOT(close());
QHBoxLayout* topLeftLayout=new QHBoxLayout;
topLeftLayout->addWidget(label);
topLeftLayout->addWidget(lineEdit);
QVBoxLayout* leftLayout=new QVBoxLayout;
leftLayout->addLayout(topLeftLayout);
leftLayout->addWidget(caseCheckBox);
leftLayout->addWidget(backwardCheckBox);
QVBoxLayout* rightLayout=new QVBoxLayout;
rightLayout->addWidget(findButton);
rightLayout->addWidget(closeButton);
rightLayout->addStretch(); //what the hell is this function?
QHBoxLayout* mainlayout=new QHBoxLayout;
mainlayout->addLayout(leftLayout);
mainLayout->addLayout(rightLayout);
setWindowTitle(tr("Find"));
setFixedHeight(sizeHint().height());
}
void FindDialog::findClicked()
{
QString text=lineEdit->text();
Qt::CaseSensitivity cs=caseCheckBox->isChecked()? Qt::CaseSensitive:Qt::CaseInsensitive;
if(backwardCheckBox->isChecked()){
emit findPrevious(text,cs);
}else{
emit findNext(text,cs);
}
}
void FindDialog::enableFindbuton(const QString &text)
{
findButton->setEnabled(!text.isEmpty());
}
的main.cpp :
#include"mainwindow.h"
#include<QApplication>
#include"finddialog.h"
class FindDialog;
int main(int argc,char*argv[])
{
QApplication app(argc,argv);
MainWindow w;
w.show();
FindDialog* dialog=new FindDialog;
dialog->show();
return app.exec();
}
mainwindow.cpp :
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QObject>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
我正在创建一个如下所示的对话窗口: 这就是我的代码的整个主要结构。希望你能理解它。 我很抱歉这么久了。
我没有像作者在书中所做的那样使用“qmake”和“make”。我直接使用Qt创建者。然后整件事搞砸了.... 这两个错误消息如下所示:
main.obj:-1: error: LNK2019: unresolved external symbol "public: __cdecl FindDialog::FindDialog(class QWidget *)" (??0FindDialog@@QEAA@PEAVQWidget@@@Z) referenced in function main
debug\test2.exe:-1: error: LNK1120: 1 unresolved externals
答案 0 :(得分:1)
从Build菜单中,选择“Run qmake”。然后清理并重建(而不是构建)您的项目。当创建新类或进行moc影响更改(添加插槽等)时,QtCreator并不聪明。如果对链接器错误有疑问,请运行qmake。
您在转发声明和缺少#include
语句时遇到了一些问题。有关为什么会破坏内容以及何时使用它的信息,请参阅What are forward declarations in C++?。
#include<QApplication>
#include"mainwindow.h"
#include"finddialog.h"
//removed forward declaration of FindDialog
int main(int argc,char*argv[])
{
QApplication app(argc,argv);
MainWindow w;
FindDialog dialog; //removed usage of new
w.show();
dialog.show();
return app.exec();
}
在你的finddialog.cpp中:
//#include <QtGui>
#include <QCheckBox>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
答案 1 :(得分:0)
finddialog.h似乎不包含FindDialog函数的定义。
在这种情况下,您需要将相应的库(包含FindDialog的定义)与您的程序链接