从非ui类到Qt UI的回调函数

时间:2010-11-09 09:12:55

标签: c++ qt4

我正在使用第三方库,我希望在某些事件中回调UI(用qt编写)。我使用UI的函数指针重新调用回调,但是当我收到回调时,我得到以下错误 “QObject :: startTimer:QTimer只能用于以QThread启动的线程”和 “QPixmap:在GUI线程之外使用pixmaps是不安全的” 和分段错误。

我搜索并发现我无法直接调用UI函数,因为它是在另一个线程中调用的

我想知道如何注册回调函数来更新UI。

2 个答案:

答案 0 :(得分:1)

解决方案有三个:

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

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

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

答案 1 :(得分:0)

嗯,听起来你需要两件事:

  1. 设置一个非GUI QObject类,其中包含回调的信号和插槽。
  2. 确保从主程序GUI线程调用/创建此类和/或其函数,可能作为程序运行时存在的(指针)数据成员。
  3. 我认为这可以解决互操作问题。