为什么我在Qt创建者中经常出现“未解析的外部”错误?

时间:2015-04-26 13:09:02

标签: c++ qt qt-creator

我正在使用 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;
}

我正在创建一个如下所示的对话窗口: enter image description here 这就是我的代码的整个主要结构。希望你能理解它。 我很抱歉这么久了。

我没有像作者在书中所做的那样使用“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

2 个答案:

答案 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的定义)与您的程序链接