我在插槽方法中尝试显示创建的对话框,但是我收到了这个错误:
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
答案 0 :(得分:21)
右键点击项目&gt;清洁
右键点击项目&gt;运行qmake
右键点击项目&gt;构建
跑步 - 第一次工作
这个工作的原因是因为Run qmake更新你的Makefile。出于某种原因,当您对项目进行更改(例如添加或删除文件)时,qt不会自动更新路径。运行qmake强制qt更新项目的路径,使其能够找到mainwindow.obj文件。您可能只需运行qmake就可以解决问题了。
答案 1 :(得分:6)
我刚刚经历过同样的问题。 “Build All”,“Rebuild All”,“Clean All”并没有帮助我解决“未解决的外部符号”问题。
然而,在我完全删除了构建目录(在我的情况下是C:\ dev \ projects \ qt \ build-qt-gui-test-Desktop_Qt_5_0_2_MSVC2010_32bit-Debug)之后,重建就成了一个魅力。
希望这对你有帮助, 弗拉基米尔
答案 2 :(得分:5)
似乎没有正确创建editstudentdialog.obj文件。尝试清理项目(Build-&gt; Clean all)并再次构建它。如果它没有帮助检查是否将editstudentdialog.cpp添加到.pro文件中的SOURCES变量。如果仍然没有任何反应,请提供.pro文件。
编辑: 如下所述,您也可以尝试删除整个应用并重新创建。
答案 3 :(得分:3)
我只是想为其他人(主要是新手)添加这个答案,他们必须创建一个全新的项目来解决这个问题:
我的头文件中有一个额外的插槽定义,这阻止了整个应用程序的运行,并且给了我指向一个不是问题的函数的错误。仅供参考。
答案 4 :(得分:1)
可能发生这种情况的另一个原因是.pro文件引用了不存在的内容。它发生在我身上,一旦我删除了那些引用,错误就消失了。
答案 5 :(得分:0)
发生这种情况的另一个原因是,如果你的函数引用被声明为标题中的内联函数
答案 6 :(得分:0)
在我的例子中,修复是在错误消息中提到的QObject派生类的开头添加一个Q_OBJECT宏。我不知道为什么我没有收到更具体地指向丢失的宏的消息。