我对Qt多线程有问题。我有一个想要作为主题的课程

//protdata.cpp

class ProtData : public QObject
{
   Q_OBJECT
   private:
      QList<ProtDataInputHandler *> _inputs;
   public:
      ProtData();
      void addInput();
      ....
};

void ProtData::addInput(QIODevice *input, bool network_order)
{
   _inputs.append(new ProtDataInputHandler());
}


我还有另一个类display.cpp,其中我使用moveToThread()将protdata对象实例化为线程;

//display.cpp
...
QThread* newThread = new QThread();
_protdata->moveToThread(newThread);
newThread->start();
...


有时,在display.cpp中:

//display.cpp
....
_protdata->addInput();


当我执行addInput方法时,出现以下错误:


  QObject:无法为处于不同线程中的父级创建子级。
  (父母是ProtData(0x19bba50),父母的线程是QThread(0x19b3c18),当前线程是QThread(0x1f08930)


怎么了?我还必须将ProtDataInputHandler类移动到newThread吗?怎么样?

谢谢

最佳答案

必须仅在procdata.cpp中调用AddInput。
如果将其定义为插槽,则可以使用信号来调用函数:

// display.h

signals :

void addInputSignal();

// display.cpp
QObject::connect(this,  SIGNAL(addInputSignal()), newThread,  SLOT(addInput()));
// ...
emit addInputSignal();

// protdata.h

public slots:

void addInput();

10-06 09:15