Ссылка на неразрешенный внешний символ в 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 шт):

Автор решения: BigBird

Проблема была решена спустя некоторое время, но всё работает: в класс 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);
};
→ Ссылка