ASSERT failure in QCoreApplication::sendEvent: "Cannot send events to objects owned by a different thread. Current thread 0x0x1e6d4cb6410. Receiver '' (of type 'QTextDocument') was created in thread
时间: 2023-08-15 11:07:58 浏览: 248
Qt之线程使用问题
这个错误通常发生在跨线程(cross-thread)发送事件(send event)时。根据错误信息,你的程序在一个线程中创建了一个QTextDocument对象,并且尝试在另一个线程中向这个对象发送事件,从而触发了这个ASSERT failure。
解决这个问题的方法是,确保所有的事件都是在创建它们的线程中发送的。具体地,你可以通过以下两种方式来避免这个错误:
1. 将事件发送到QTextDocument对象所在的线程中,可以使用QMetaObject::invokeMethod()函数或QTimer::singleShot()函数来实现:
```c++
QMetaObject::invokeMethod(textDocument, "append", Qt::QueuedConnection, Q_ARG(QString, "Hello World!"));
```
其中,textDocument是QTextDocument对象的指针,"append"是要调用的函数名,Qt::QueuedConnection表示使用队列连接方式,Q_ARG(QString, "Hello World!")表示传递的参数。
2. 将QTextDocument对象移动到新线程中,可以使用QObject::moveToThread()函数来实现:
```c++
QThread* newThread = new QThread;
textDocument->moveToThread(newThread);
newThread->start();
```
其中,newThread是新线程的指针,textDocument是QTextDocument对象的指针。这样,textDocument对象就会被移动到新线程中,所有事件都可以在新线程中发送和处理。
需要注意的是,第二种方式可能需要重新设计程序架构,因为将对象移动到新线程中可能会对程序的逻辑产生影响。
阅读全文