Ссылка на неразрешенный внешний символ в Qt Creator (использование progressBar)
Выполнял практику по С++ и уткнулся в ошибку с кодом LNK2019. По заданию необходимо создать программу, которая загружает бинарный файл с целыми числами, которые обрабатываются в потоке: если число отрицательное, то оно заменяется на 0. Всё это дело необходимо подкрепить progress bar'ом, чтобы он отслеживал прогресс обработки.
Однако именно с прогресс баром у меня и проблемы. Если закомментировать строку emit progress_bar(1 + (k / coef));
в ReadFile.cpp, то всё работает. (Кроме прогресс бара, естественно) Может ли кто-нибудь указать, в чем моя ошибка и как её можно исправить?
Сам код:
ReadFile.h
//ReadFile.h:
#ifndef READFILE_H
#define READFILE_H
#include <QThread>
#include <QFile>
#include <QProgressBar>
#include <QDebug>
class ReadFile : public QThread
{
private:
QString dir;
public:
explicit ReadFile(QObject *pb);
void set_dir(QString directory);
protected:
void run() override;
signals:
void progress_bar(int);
};
#endif // READFILE_H
ReadFile.cpp
//ReadFile.cpp:
#include "ReadFile.h"
ReadFile::ReadFile(QObject *pb = 0){
}
void ReadFile::set_dir(QString directory)
{
dir = directory;
}
void ReadFile::run()
{
QFile file(dir);
int coef = (file.size()/4)/100;
if (file.open(QIODevice::ReadWrite))
{
QDataStream stream(&file);
stream.setVersion(QDataStream::Qt_2_0);
stream.setByteOrder(QDataStream::LittleEndian);
int k = 0;
int value;
while(!stream.atEnd())
{
stream >> value; //Считываем значение
//Заменяем отрицательные числа на 0
if(value < 0){
value = 0;
file.seek(file.pos() - 4); //Возвращаемся к текущему значению
stream << value; //Записываем измененное значение обратно в файл
}
emit progress_bar(1 + (k / coef)); //Вот из-за этого возникает ошибка LNK2019
k++;
}
file.close();
}
}
mainwindow.h:
//mainwindow.h
#include "ReadFile.h"
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void load_folder();
void buttonOK();
private slots:
void on_ButtonOK_clicked();
void finished_thr();
private:
Ui::MainWindow *ui;
ReadFile* rf;
QString dir;
};
#endif // MAINWINDOW_H
mainwindow.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QFileDialog"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
load_folder();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::load_folder()
{
QFileDialog fd;
dir = fd.getOpenFileName();
if (dir=="") ui->labelFileName->setText("Choose file!"); //если пустая директория
else
{
//директория
dir.replace(QString('/'), QString("\\"));
ui->labelFileName->setText(dir);
rf = new ReadFile(ui->progressBar);
rf->set_dir(dir);
if (dir.contains("samples"))ui->ButtonOK->setEnabled(true);
else ui->ButtonOK->setEnabled(false);
}
}
void MainWindow::finished_thr()
{
if (rf->isFinished())
{
ui->ButtonOK->setEnabled(false);
delete rf;
}
}
void MainWindow::buttonOK()
{
QObject::connect(rf,SIGNAL(progress_bar(int)),ui->progressBar, SLOT(setValue(int)));
QObject::connect(rf,SIGNAL(finished()),this,SLOT(finished_thr()));
rf->start();
}
void MainWindow::on_ButtonOK_clicked()
{
buttonOK();
}
Сообщение об ошибке:
ReadFile.obj:-1: error: LNK2019: unresolved external symbol "public: void __cdecl ReadFile::progress_bar(int)" (?progress_bar@ReadFile@@QEAAXH@Z) referenced in function "protected: virtual void __cdecl ReadFile::run(void)" (?run@ReadFile@@MEAAXXZ)
C:\Users\DNS\Documents\build-PR13-Desktop_x86_windows_msvc2022_pe_64bit-Debug\debug\PR13.exe:-1: error: LNK1120: 1 unresolved externals
Ответы (1 шт):
Проблема была решена спустя некоторое время, но всё работает: в класс ReadFile (ReadFile.h) необходимо было просто добавить Q_Object:
class ReadFile : public QThread
{
Q_OBJECT
private:
QString dir;
public:
explicit ReadFile(QObject *pb);
void set_dir(QString directory);
void run();
signals:
void progress_bar(int);
};