目录
首先要强调的是,子线程是不能直接操作GUI的,关于原因,详见:
C++面试题之为什么不能多线程直接操作GUI状态
Qt提供了三种方式来实现异步操作GUI
1.postEvent
2.信号和槽
3.InvokeMethod
一.postEvent
[static] void QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority = Qt::NormalEventPriority)
:postEvent函数将事件添加到事件队列后立即返回,receiver是该事件的接收者。事件必须分配到堆上,因为事件队列将获得事件的所有权,并在发布后将其删除。在事件发布后访问它是不安全的。
事件按优先级降序排序,即优先级高的事件在优先级低的事件之前排队。优先级可以是任何整数值,即INT_MAX和INT_MIN之间,包括INT_MAX;有关详细信息,请参阅Qt::EventPriority。
许多第三方库通过回调函数的方式将数据传给上层处理,比如将解码后的图像数据交给Qt渲染显示。但回调函数不一定运行在主线程中,因此我们需要将数据封装成事件,然后用postEvent添加到事件列表,接着就可以在主线程重写的event方法中处理该事件了。
struct Frame
{
uint8_t *buffer;