谁能帮助我,为什么我会收到这个已删除的函数错误,即使我将参数作为指针引用 (*&) 传递?这是一个在 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 Work和 Effective 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/