ui操作必须在主线程做的,分支线程只能发送消息给主线程进行引导操作
想在别的线程刷新UI,可以发送事件给UI线程,通知它更新。
或者在线程内的worker对象上定义一个信号,连接到Widget的update()上,然后你在合适的时候emit 你的信号即可。
在做QT编程的时候,有一点很重要的就是一个QT进程只能有一个UI线程,而且所有关于UI的操作只能在这个线程上进行。
一个例子,程序需要一个后台线程进行耗时操作,前台用一个Dialog显示进度,在Windows下面,可以让这个后台线程直接更改这个Dialog显示的进度,但在QT下,这样会产生无法预期的结果,正确的做法是让后台线程postEvent给UI线程,让UI线程去更新进度显示。
为什么QT有这样的限制而windows没有呢?
因为QT最初设计成可以可以编译成只支持单线程或者可以支持多线程,因为大多数工作一个线程就足够了。更关键的是,UI的操作最终是要操作于显存(或者系统内存),对于X系统而言,client和server的通讯需要socket,而这些都是资源,多个线程需要访问同一资源的时候,需要线程间同步。线程间同步是耗时的,QT设计之初不想消耗这样的效率,于是决定干脆只让一个线程做UI操作。Windows到底怎么让多个线程访问UI资源的,不大清楚细节,但是肯定要用进程间同步。QT发展到4.0beta,每个线程都可以有自己的event loop,但是还是保留了只有一个UI线程的设计。
实际上,只容许一个UI线程是一个好的系统设计,这样一方面提高了效率,另一方面也明显区分了worker和UI之间的逻辑。Java