MyThread类继承Qthread,MyThread包含一个OBJECT类,QObject: Cannot create children for a parent that is in a different thread. (Parent is IEC104Master(0x3258a00), parent's thread is QThread(0x243c4009f0)), current thread is MyThread(0x3258 xiancheng id 0x7fd2117fa700
时间: 2023-08-24 10:04:27 浏览: 102
这个错误提示是因为您在一个线程中创建了一个QObject对象,但是您试图将其分配给另一个线程的QObject作为父对象,这是不允许的。QObject可以作为父对象,但是父对象和其子对象必须在同一个线程中。
解决这个问题的方法是,在MyThread中创建您的QObject对象,并将其设置为MyThread的成员变量,而不是作为其父对象。如果您需要在其他线程中使用这个QObject对象,您可以使用Qt的信号和槽机制来实现线程之间的通信。例如,您可以在MyThread中定义一个信号,然后在其他线程中连接这个信号,以便在MyThread中产生一个事件时,其他线程可以收到通知并执行相应的操作。
相关问题
MyThread类继承Qthread,MyThread包含一个OBJECT类,MyThread在主线程初始化并启动出现下列错误 QObject: Cannot create children for a parent that is in a different thread. (Parent is IEC104Master(0x3258a00), parent's thread is QThread(0x243c4009f0)), current thread is MyThread(0x3258 xiancheng id 0x7fd2117fa700,请思考一下解决
这个错误提示是因为您在MyThread线程中创建了一个QObject对象,并将其父对象设置为另一个线程中的对象(即IEC104Master对象)。这是不允许的,因为QObject对象和其父对象必须在同一个线程中。
解决这个问题的方法是,在MyThread线程中创建您的QObject对象,并将其设置为MyThread线程的直接子对象,而不是设置IEC104Master对象为其父对象。这样做可以确保QObject对象和MyThread线程在同一个线程中。例如,
```
class MyThread : public QThread
{
Q_OBJECT
public:
explicit MyThread(QObject *parent = nullptr) : QThread(parent)
{
// 在构造函数中创建QObject对象并将其设置为MyThread线程的直接子对象
m_object = new QObject();
m_object->moveToThread(this);
}
~MyThread() override
{
// 在析构函数中删除QObject对象
delete m_object;
}
private:
QObject *m_object;
};
```
在上述示例中,我们在MyThread的构造函数中创建了一个QObject对象,并使用moveToThread()方法将其设置为MyThread线程的直接子对象。这样做可以确保QObject对象和MyThread线程在同一个线程中,避免了跨线程访问的问题。
QObject: Cannot create children for a parent that is in a different thread. (Parent is MyThread(0x289c010), parent's thread is QThread(0x1aac400), current thread is MyThread(0x289c010)
这个错误是因为在不同的线程中创建了一个 QObject 的子对象。在 Qt 中,每个 QObject 对象都必须与一个线程相关联,以确保线程安全。如果您想在一个线程中创建 QObject 的子对象,并将其添加到另一个线程中的父 QObject 中,那么您需要使用 Qt 的信号和槽机制来实现跨线程通信。您需要确保在子对象的构造函数中,将其设置为父 QObject 的指针,以便在父对象被销毁时,子对象也会被销毁。同时,您需要在父对象所在的线程中创建子对象,或者使用 Qt 的线程机制将其转移到父对象所在的线程中。
阅读全文
相关推荐
















