我正在使用 Qt,当其他线程中的事件 ocorr(pjsip 库收到调用)时,我正在尝试从主线程调用方法(导航到其他选项卡)。
我做了一个类来使用你的名字是“SipHandlerController”的接口。我在我的主类中扩展了这个类(我的代码中来自 Qt 的主窗口的名称为 Start)。
我的课程用于从 pjsip 到“接听电话”的线程。从 pjsip 到处理这个事件的类也有一个来自“SipHandlerController”类型的属性,这个属性接收我的主类的实例(这是在其他线程中运行以操作所有 ui)。当 pjsip 线程调用“接收呼叫”事件时,它确实从我的主线程调用该方法(实现 SipHandlerController 的方法),但是收到错误并且应用程序损坏:
QCoreApplication::sendEvent 中的 ASSERT 失败:“无法向其他线程拥有的对象发送事件。当前线程 0x0x26545658。在线程 0x0x2071ab68 中创建了接收器 'pageDialer'(类型为 'QWidget')”,文件 kernel\qcoreapplication.cpp,行576
我的界面
#ifndef SIP_HANDLER_CONTROLLER_H
#define SIP_HANDLER_CONTROLLER_H
#include <pjsua2.hpp>
using namespace pj;
class SipHandlerController
{
public:
virtual void onSipIncomingRinging(Call * call) = 0;
};
#endif // SIP_HANDLER_CONTROLLER_H
我在课堂上的实现从 pjsip 监听事件
void SipLine::onIncomingCall(OnIncomingCallParam &iprm){
SipCall *call = new SipCall(*this, iprm.callId);
call->setHandler(this->handler);
if(this->handler != nullptr){
// Here is call the method from main thread
this->handler->onSipIncomingRinging(call);
}
}
我来自主类的标题(实现类“SipHandlerController”,这个类是我的主线程)。
class Start : public QMainWindow, public SearchHandler, public FooterHandler, public SipHandlerController, public PhonebookHandler
{
Q_OBJECT
public:
explicit Start(QWidget *parent = nullptr);
~Start();
virtual void onSipIncomingRinging(Call * call);
}
我主要实现 SipHandlerController 的源代码。(nav 是一个 QStackedWidget),调用了 onSipIncomingRinging 方法,但此时应用程序被破坏了。
void Start::onSipIncomingRinging(Call * call){
this->call = call;
ui->nav->setCurrentIndex(NavigationTabs::RINGING);
}