2010-11-09 85 views
1

我正在使用第三方库,我想在回调到UI(用qt编写)时发生一些事件。我使用UI的函数指针注册回调函数,但是当我得到回调函数时,出现以下错误 “QObject :: startTimer:QTimer只能用于以QThread开头的线程”和 “QPixmap:它不是可以安全地在GUI线程之外使用pixmaps“ 和分段错误。从非UI类到Qt UI的回调函数

我搜查,发现我不能直接调用UI功能,因为它被称为在不同的线程

我想知道我怎么可以注册回调函数来更新UI。

回答

0

嗯,这听起来像你需要两样东西:

  1. 设置了信号和槽的回调非GUI的QObject类。
  2. 确保从主程序GUI线程调用/创建此类和/或其函数,可能作为程序运行时存在的(指针)数据成员。

我认为这将解决互操作问题。

+0

该类不一定在同一个线程中。这是信号/插槽的功能。 – ypnos 2010-11-09 09:40:44

+0

我已经创建了一个新的类和一个静态函数,并将其指针传递给回调函数,但它仍然给出相同的错误。我只是调用回调函数和打印一些跟踪,而不是现在甚至不更新ui。 – prasad 2010-11-09 11:15:38

+0

@ypnos:我认为是这样,但显然OP需要它在同一个线程中...你的解决方案似乎更好,但:) – rubenvb 2010-11-09 17:13:54

1

解决办法有三个:

  • 使用的QThread实例你的工作线程。
  • 使用QImage而不是QPixmap。 QPixmaps存储在图形子系统中,因此由主(GUI)线程控制。 QImages生活在记忆中,可以由任何线程保存。
  • 使用信号/插槽概念。从主线程以外的其他线程发出信号是合法的。

仅当您还希望在工作线程内部接收到信号时,来自用户输入的反馈(例如“取消”按钮),您的工作线程中也需要一个QT事件循环。如果您的QTimer要在工作线程w/o事件循环中触发一个插槽,则无法工作。

阅读http://doc.trolltech.com/4.5/threads.html