QVector with Qthreads

QVector with Qthreads

本文关键字:Qthreads with QVector      更新时间:2023-10-16

您好,我正在尝试构建QThread对象的QVector,但是当我尝试构建时,'QObject::QObject' : cannot access private member declared in class 'QObject'出现此错误。有人可以告诉我为什么我会收到这个错误以及如何克服它或指出我答案的方向。谢谢你的时间。

主要。.CPP

#include <QCoreApplication>
#include "thread.h"
#include <QDebug>
#include <QThread>
main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    unsigned long long startingNumberAnswer = 0;
    unsigned long long totalIterationsAnswer = 0;
    int numberOfThreads = 10;

    QVector<Thread> threads(numberOfThreads);
    for(int l = 0; l < threads.size(); l++ ){
        threads[l].setPriority(QThread::TimeCriticalPriority);
    }

    for(int i = 1; i< 2000000; i+=numberOfThreads){
        qDebug() << "Longest iteration Number =  " << startingNumberAnswer;
        qDebug() << "Number of iterations for " << startingNumberAnswer << " is " << totalIterationsAnswer;
        qDebug() << "Running # " << i;

        system("CLS");
    }

    qDebug() << "Longest iteration Number =  " << startingNumberAnswer;
    qDebug() << "Number of iterations for " << startingNumberAnswer << " is " << totalIterationsAnswer;

    return a.exec();
}

线。H

#ifndef THREAD_H
#define THREAD_H
#include <QObject>
#include <QThread>
class Thread :  public QThread
{
    Q_OBJECT
public:
    explicit Thread();
    unsigned long long getloops();
    unsigned long long getnumber();
signals:
public slots:
    void run(unsigned long long value);
private:
    unsigned long long largestNumber;
    unsigned long long loops;
    unsigned long long number;

};
#endif // THREAD_H

线。.CPP

#include "thread.h"
Thread::Thread()
{
}
void Thread::run(unsigned long long value)
{
   unsigned long long n = value;
   unsigned long long counter = 0;
   while ( n > 1){
       if(n%2 == 0){
          n = n/2;
       } else {
          n = (3*n) + 1;
       }
       counter++;
   }
    loops = counter;
    number = value;
}
unsigned long long Thread::getloops(){
    return loops;
}
unsigned long long Thread::getnumber(){
    return number;
}

简单地说,QObject 对象不可复制或分配 - 检查官方文档:

没有复制构造函数或赋值运算符

QObject既没有复制构造函数,也没有赋值运算符。 这是设计使然。实际上,它们是声明的,但是在私人中 部分包含宏 Q_DISABLE_COPY()。事实上,所有Qt类 派生自 QObject(直接或间接) 使用此宏声明 它们的复制构造函数和赋值运算符是私有的。这 推理可以在Qt上关于身份与价值的讨论中找到 "对象模型"页。

主要后果是你应该使用指向 QObject 的指针(或 你的 QObject 子类),否则你可能会想在其中使用 您的 QObject 子类作为值。例如,没有副本 构造函数,您不能使用 QObject 的子类作为要的值 存储在其中一个容器类中。必须存储指针。

因此,您需要使用 QVector<Thread*> 来存储线程(不要忘记在使用它们之前创建对象)。

在QVector的文档中也指出:

QVector 的值类型必须是可分配的数据类型。这涵盖了大多数常用的数据类型,但编译器不会允许您将 QWidget 存储为值;相反,存储一个 QWidget *。一些功能有额外的要求;例如,indexOf() 和 lastIndexOf() 期望值类型支持 operator==()。这些要求是按功能记录的。