5
  1. 我创建了一个 GUI 应用程序 -> QMainWindow
  2. 我在菜单 + 插槽中添加了 1 项。
  3. 我创建了一个新项目-> QDialog
  4. 我使用插槽方法尝试显示创建的对话框,但出现此错误:

    mainwindow.obj:-1: 错误: LNK2019: 无法解析的外部符号“public: __cdecl EditStudentDialog::EditStudentDialog(class QWidget *)” (??0EditStudentDialog@@QEAA@PEAVQWidget@@@Z) 在函数“private: void __cdecl”中引用MainWindow::on_actionNew_triggered(void)" (?on_actionNew_triggered@MainWindow@@AEAAXXZ)

    mainwindow.obj:-1:错误:LNK2019:无法解析的外部符号“public:virtual __cdecl EditStudentDialog::~EditStudentDialog(void)”(??1EditStudentDialog@@UEAA@XZ)在函数“private:void __cdecl MainWindow::on_actionNew_triggered”中引用(void)" (?on_actionNew_triggered@MainWindow@@AEAAXXZ)

这是主窗口:

#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 slots:
    void on_actionNew_triggered();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "editstudentdialog.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_actionNew_triggered()
{
    EditStudentDialog editDialog;
    editDialog.setModal(true);
    editDialog.exec();
}

这是对话框(只是一个空的,上面没有控件):

#ifndef EDITSTUDENTDIALOG_H
#define EDITSTUDENTDIALOG_H

#include <QDialog>

namespace Ui {
class EditStudentDialog;
}

class EditStudentDialog : public QDialog
{
    Q_OBJECT

public:
    explicit EditStudentDialog(QWidget *parent = 0);
    ~EditStudentDialog();

private:
    Ui::EditStudentDialog *ui;
};

#endif // EDITSTUDENTDIALOG_H


#include "editstudentdialog.h"
#include "ui_editstudentdialog.h"

EditStudentDialog::EditStudentDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::EditStudentDialog)
{
    ui->setupUi(this);
}

EditStudentDialog::~EditStudentDialog()
{
    delete ui;
}

我究竟做错了什么?

编辑:这是 .pro 文件

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = GUI1
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp \
    editstudentdialog.cpp

HEADERS  += mainwindow.h \
    editstudentdialog.h

FORMS    += mainwindow.ui \
    editstudentdialog.ui

PS:我试图清理项目然后构建它,但仍然是同样的问题。

编辑 2:我将 Qt Creator 2.7 与 Qt 5.0.2 一起使用

4

7 回答 7

22

解决方案

  1. 右键单击项目>清理

  2. 右键单击项目 > 运行 qmake

  3. 右键单击项目>构建

  4. 运行 - 第一次工作

为什么有效

这样做的原因是因为 Run qmake 会更新您的 Makefile。由于某种原因,当您对项目进行更改(例如添加或删除文件)时,qt 不会自动更新路径。运行 qmake 会强制 qt 更新项目的路径,使其能够找到 mainwindow.obj 文件。您可能只需运行 qmake 即可解决您的问题。

于 2013-05-09T15:03:19.847 回答
6

似乎没有正确创建 editstudentdialog.obj 文件。尝试清理项目(Build->Clean all)并再次构建它。如果没有帮助,请检查是否将 editstudentdialog.cpp 添加到 .pro 文件中的 SOURCES 变量中。如果仍然没有任何反应,请提供 .pro 文件。

编辑:如下所述,您也可以尝试删除整个应用程序并重新创建它。

于 2013-04-07T17:00:33.123 回答
6

我刚刚遇到了同样的问题。“全部构建”、“全部重建”、“全部清除”并没有帮助我解决“未解决的外部符号”问题。

但是,在我完全删除了构建目录(在我的情况下为 C:\dev\projects\qt\build-qt-gui-test-Desktop_Qt_5_0_2_MSVC2010_32bit-Debug)之后,重建就像一个魅力。

希望这对你有帮助,弗拉基米尔

于 2013-04-16T22:01:29.133 回答
3

我只是想为必须创建一个全新项目来解决问题的其他任何人(主要是菜鸟)添加这个答案:

我的头文件中有一个额外的插槽定义,它阻止了整个应用程序运行,并给了我指向一个不是问题的函数的错误。供参考。

于 2014-07-10T19:56:38.797 回答
1

发生这种情况的另一个原因是 .pro 文件引用了不存在的内容。它发生在我身上,一旦我删除了这些引用,错误就消失了。

于 2014-11-18T15:40:06.420 回答
1

在我的情况下,修复是在错误消息中提到的 QObject 派生类的开头添加一个 Q_OBJECT 宏。我不知道为什么我没有收到更具体地指出我丢失的宏的消息。

于 2017-03-17T14:34:05.597 回答
0

发生这种情况的另一个原因是,如果它引用的函数在标头中声明为内联函数

于 2016-03-13T00:35:38.843 回答