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: プロジェクトをクリーンアップしてからビルドしようとしましたが、それでも同じ問題が発生します。

EDIT 2: Qt 5.0.2 で Qt Creator 2.7 を使用しています

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

私はちょうど同じ問題を経験しました。「すべてビルド」、「すべて再ビルド」、「すべてクリーン」は、「未解決の外部シンボル」の問題を解決するのに役立ちませんでした。

ただし、ビルド ディレクトリ (私の場合は C:\dev\projects\qt\build-qt-gui-test-Desktop_Qt_5_0_2_MSVC2010_32bit-Debug) を完全に削除した後、再構築はうまく機能しました。

これがお役に立てば幸いです、ウラジミール

于 2013-04-16T22:01:29.133 に答える
6

editstudentdialog.obj ファイルが正しく作成されていないようです。プロジェクトをクリーンアップして (Build->Clean all)、再度ビルドしてください。解決しない場合は、editstudentdialog.cpp が .pro ファイルの SOURCES 変数に追加されているかどうかを確認してください。それでも何も起こらない場合は、.pro ファイルを提供してください。

編集: 以下で説明したように、アプリ全体を削除して再度作成することもできます。

于 2013-04-07T17:00:33.123 に答える
3

問題を解決するためにまったく新しいプロジェクトを作成しなければならなかった他の人 (主に初心者) のために、この回答を追加したかっただけです。

ヘッダー ファイルに追加のスロット定義があり、アプリケーション全体が実行できなくなり、問題ではない関数を指すエラーが発生しました。ご参考までに。

于 2014-07-10T19:56:38.797 に答える
1

これが発生するもう 1 つの理由は、.pro ファイルが存在しないものを参照しているためです。それは私に起こり、それらの参照を削除すると、エラーはなくなりました。

于 2014-11-18T15:40:06.420 に答える
0

これが発生するもう1つの理由は、参照している関数がヘッダーでインライン関数として宣言されている場合です

于 2016-03-13T00:35:38.843 に答える