我检查了一个令人满意的解释,但找不到。通常文档提到为了在线程之间使用信号/槽,我们需要使用事件循环并通过调用exec来启动它们。
但是我可以看到没有使用exec(),我仍然可以发送信号并跨线程处理它们。
它的确切用途是什么?
答案 0 :(得分:3)
如果要运行事件循环,请使用QThread::exec()
Qt在QThread类中为您提供。如果不调用exec(),则需要创建自己的事件循环来处理Qt事件(即,如果您希望信号/插槽工作)。除非你有非常具体的需求,否则这几乎肯定比它的价值更多。
你说你还可以发送信号/插槽吗?我的猜测是你实际上并没有在不同的线程上运行任何东西。使用QThread时这是一个非常常见的问题。在您认为在不同线程上运行的代码中放置一个断点并查看堆栈跟踪 - 您可能会感到震惊!
答案 1 :(得分:2)
一个粗略的例子。
假设您有一个文本框。在每个字母上,用户键入要执行某些后台任务的文本框。您可以为此设置QThread
。只要文本框的内容发生变化,就会发送内容。从处理后台任务的QThread
分配一个插槽。任务完成后,从QThread
发出一些东西。从主线程处理此信号。连接他们。创建文本框时(或任何适当的时间)启动线程。如果您从exec()
致电QThread::run()
,那么您不需要多次start()
该主题。
如果您不使用此机制,则每次文本框内容更改时,您可能需要创建(和/或start()
)QThread
,执行后台任务并获得结果。这次你仍然可以在主线程和这个线程之间使用信号/槽,但你需要多次start()
线程。