0

我正在使用 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);
}
4

1 回答 1

1

使用 e 发出的信号解决了:

添加了信号

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);
    signals:
        void onSipIncomingRingingEvent(Call * call);
}

实现已更改为发出信号

void Start::onSipIncomingRinging(Call * call){
    emit onSipIncomingRingingEvent(call);
}

插槽改变前端

void Start::on_Start_onSipOutgoingRingingEvent(Call * call)
{
    this->call = call;
    ui->nav->setCurrentIndex(NavigationTabs::CONTACT);
}
于 2018-08-29T17:03:50.223 回答