質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Qt Creator

Qt Creatorは、Qtアプリケーションを開発するための開発統合環境(IDE)です。

Q&A

解決済

2回答

5848閲覧

Mastering Qt5 未解決の外部シンボル

wabisuke2718

総合スコア96

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Qt Creator

Qt Creatorは、Qtアプリケーションを開発するための開発統合環境(IDE)です。

0グッド

0クリップ

投稿2017/04/12 09:49

Mastering Qt5

https://www.amazon.co.jp/gp/product/B01F7HCAXK/ref=oh_aui_d_detailpage_o00_?ie=UTF8&psc=1

という本を読んでいるのですが、

mainwindow.obj👎 エラー: LNK2019: 未解決の外部シンボル "public: __cdecl Task::Task(class QString const &,class QWidget *)" (??0Task@@QEAA@AEBVQString@@PEAVQWidget@@@Z) が関数 "public: void __cdecl MainWindow::addTask(void)" (?addTask@MainWindow@@QEAAXXZ) で参照されました。

というエラーが出て、本に書いてあるコードと自分のコードを見比べてみましたが、同じで、解決方法が分かりません。

mainwindow.h

c++

1#ifndef MAINWINDOW_H 2#define MAINWINDOW_H 3 4#include <QMainWindow> 5#include <QVector> 6#include "task.h" 7 8namespace Ui { 9class MainWindow; 10} 11 12class MainWindow : public QMainWindow 13{ 14 Q_OBJECT 15 16public: 17 explicit MainWindow(QWidget *parent = 0); 18 ~MainWindow(); 19 20public slots: 21 void addTask(); 22 23private: 24 Ui::MainWindow *ui; 25 QVector<Task*> mTasks; 26}; 27 28#endif // MAINWINDOW_H 29

task.h

c++

1#ifndef TASK_H 2#define TASK_H 3 4#include <QWidget> 5#include <QString> 6 7namespace Ui { 8class Task; 9} 10 11class Task : public QWidget 12{ 13 Q_OBJECT 14 15public: 16 explicit Task(const QString& name, QWidget *parent = 0); 17 ~Task(); 18 19 void setName(const QString& name); 20 QString name() const; 21 bool isCompleted() const; 22 23private: 24 Ui::Task *ui; 25}; 26 27#endif // TASK_H 28

mainwindow.cpp

c++

1#include "mainwindow.h" 2#include "ui_mainwindow.h" 3#include <QDebug> 4 5MainWindow::MainWindow(QWidget *parent) : 6 QMainWindow(parent), 7 ui(new Ui::MainWindow), 8 mTasks() 9{ 10 ui->setupUi(this); 11 connect(ui->addTaskButton, &QPushButton::clicked, this, &MainWindow::addTask); 12} 13 14MainWindow::~MainWindow() 15{ 16 delete ui; 17} 18 19void MainWindow::addTask() 20{ 21 qDebug() << "Adding new task"; 22 Task* task = new Task("Untitled task"); 23 mTasks.append(task); 24 ui->tasksLayout->addWidget(task); 25} 26

task.cpp

c++

1#include "task.h" 2#include "ui_task.h" 3 4Task::Task(const QString& name, QWidget *parent) : 5 QWidget(parent), 6 ui(new Ui::Task) 7{ 8 ui->setupUi(this); 9 setName(name); 10} 11 12Task::~Task() 13{ 14 delete ui; 15} 16 17void Task::setName(const QString &name) 18{ 19 ui->checkbox->setText(name); 20} 21 22QString Task::name() const 23{ 24 return ui->checkbox->text(); 25} 26 27bool Task::isCompleted() const 28{ 29 return ui->checkbox->isChecked(); 30} 31

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

なぜだか分かりませんが、プロジェクトペインの該当プロジェクトを右クリック、qmakeの実行をするとデバッグモードでも実行できました。お騒がせしました。

投稿2017/04/12 11:07

wabisuke2718

総合スコア96

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

まず、エラーメッゼージから、void MainWindow::addTask()から呼び出してるメソッドのシンボルがないとわかります。

で、その中のメソッドで呼び出されてる、new Task()の引数で、QWidgetが指定されてないんじゃないでしょうか。
Task(class QString const &,class QWidget *)で、定数とQWidgetが必要なメソッドなのだとおもったのですが。

投稿2017/04/12 10:16

King_of_Flies

総合スコア382

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wabisuke2718

2017/04/12 10:24

それも考えてみたのですが、task.hで public: explicit Task(const QString& name, QWidget *parent = 0); と宣言しているので、省略可能ではないでしょうか。間違っていたら教えてください。 試しに Task* task = new Task("Untitled task", 0); と呼び出してみたのですが、同じエラーがでました。
wabisuke2718

2017/04/12 10:57

ちなみに開発環境はQt Creatorを使っています。 あと、デバッグではなくリリースモードで実行すると問題なく実行されウィンドウが出てくるのですが、 なぜでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問