c++ - qt C++信号与槽中删除函数错误的使用

标签 c++ multithreading qt

谁能帮助我,为什么我会收到这个已删除的函数错误,即使我将参数作为指针引用 (*&) 传递?这是一个在 Qt 中使用多线程的简单项目,我只是想尝试在父线程和子线程之间共享和修改对象。我是 Qt 的新手,我在 Ubuntu Linux 14.04 上使用 Qt 5.9.2 和 GCC 4.9.4。

提前致谢。

===== Controller.hpp ===========
#pragma once

#include "data.hpp"

#include <QObject>
#include <QThread>

class Controller : public QObject
{
    Q_OBJECT
    QThread workerThread;
public:
    explicit Controller(QObject *parent = nullptr);
    ~Controller();

signals:
    void operate(Data*& data);

public slots:
    void handleResults(int idx);

private:
    Data _data;
};

===== Controller.cpp ===========
#include "controller.hpp"
#include "worker.hpp"

#include <QDebug>

Controller::Controller(QObject *parent) : QObject(parent)
{
    Worker *worker = new Worker;
    worker->moveToThread(&workerThread);
    connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
    connect(this, &Controller::operate, worker, &Worker::doWork);
    connect(worker, &Worker::resultReady, this, &Controller::handleResults);
    workerThread.start();

    emit operate(&_data);
}

Controller::~Controller()
{
    workerThread.quit();
    workerThread.wait();
}

void Controller::handleResults(int idx)
{
    qDebug() << _data.at(idx);
}

===== Worker.hpp ===========
#pragma once

#include "data.hpp"

#include <QObject>

class Worker : public QObject
{
    Q_OBJECT
public:
    explicit Worker(QObject *parent = nullptr);

signals:
    void resultReady(int idx);

public slots:
    void doWork(Data*& data);
};

===== Worker.cpp ===========
#include "worker.hpp"

Worker::Worker(QObject *parent) : QObject(parent)
{
}

void Worker::doWork(Data*& data)
{
    data->insertVal(10);
    emit resultReady(data->getSize());
}

===== Data.hpp ===========
#pragma once

#include <QObject>
#include <QVector>

class Data : public QObject
{
    Q_OBJECT
public:
    explicit Data(QObject *parent = nullptr);

    void insertVal(int i);
    int getSize() const { return _intVec.size(); }

private:
    QVector<int*> _intVec;
};

===== Data.cpp ===========
#include <QDebug>

#include "data.hpp"

Data::Data(QObject *parent) : QObject(parent)
{
}

void Data::insertVal(int i)
{
    _intVec << &i;
    qDebug() << "Data inserted: " << i;
}

===== main.cpp ===========
#include "controller.hpp"
#include "data.hpp"

#include <QCoreApplication>

int main(int argc, char *argv[])
{
    qRegisterMetaType<Data>("Data");

    QCoreApplication a(argc, argv);

    Controller con;
    return a.exec();
}

我收到这些错误:

/home/raze/Qt/5.9.2/gcc_64/include/QtCore/qmetatype.h:765: error: use of deleted function ‘Data::Data(const Data&)’
             return new (where) T(*static_cast<const T*>(t));

/home/raze/Qt/5.9.2/gcc_64/include/QtCore/qobject.h:454: error: ‘QObject::QObject(const QObject&)’ is private
     Q_DISABLE_COPY(QObject)
                    ^
                                                           ^
/home/raze/Documents/Qt_projects/PracThread/data.hpp:6: error: within this context
 class Data : public QObject
       ^

/home/raze/Documents/Qt_projects/PracThread/data.hpp:6: error: use of deleted function ‘QObject::QObject(const QObject&)’

最佳答案

如果你改变void operate(Data*& data);void operate(Data* data); 在 Controller 类中更改 void doWork(Data*& data);void doWork(Data* data);在 worker 类中,你的代码编译得很好但是从我的评论中阅读 How Qt Signals and Slots WorkEffective Threading Using Qt这篇文章看起来适合所有 Qt/C++ 新手。

编辑:

来自@altaf 的评论:澄清一下,问题的根源是由 qRegisterMetaType<Data>("Data"); 引起的在我的 main.cpp 文件中。数据应通过信号和槽由指针传递,因此应将其注册为类似 qRegisterMetaType<*Data>("pData"); 的内容。所有信号和槽都应将参数作为 Data* pData

关于c++ - qt C++信号与槽中删除函数错误的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47245521/

相关文章:

关于 Intel PCM 源代码的 C++ #ifndef INTELPCM_API #define INTELPCM_API #endif

c++ - 为什么 SDL_Mixer 不能播放某些 mp3 的音乐?

c++ - 多线程环境中的静态局部变量初始化

c++ - KeyPressEvent 不起作用

c++ - 弹出窗口。如何显示全文内容和另外两个问题

c++ - Eclipse CDT : nothing could be resolved?

c++ - 我怎样才能让一个对象知道它在哪个容器中?

c# - 如何确保线程安全的 Web API 基础 Controller 方法

php - 在 php 中使用 pthread 进行后台处理

qt - Ubuntu 上 https 站点上的 QtWebkit 出现 SSL 错误