如何使用带有Qt和C++的"Interface Class"进行通信

How communicate two thread, using a "Interface Class" with Qt and C++

本文关键字:Interface Class 通信 C++ 何使用 Qt      更新时间:2023-10-16

我正在使用Qt,并且当其他线程(pjsip 库(中的事件ocorr收到调用时,我正在尝试从主线程调用方法(导航到其他选项卡(。

我做了一个类来使用你的名字是"SipHandlerController"的接口。我在我的主类中扩展了这个类(在我的代码中,Qt的主窗口有名字Start(。

我的类在 pjsip 的线程中用于"接听电话"。从 pjsip 到处理程序此事件的类也具有类型"SipHandlerController"的属性,此属性接收我的主类的实例(这在其他线程中运行以操作所有 ui(。当 pjsip 线程调用"接收调用"的事件时,它确实从我的主线程(实现 SipHandlerController 的方法(调用该方法,但收到错误并且应用程序损坏:

QCoreApplication::sendEvent中的ASSERT失败:"无法将事件发送到其他线程拥有的对象。当前线程 0x0x26545658。接收器"pageDialer"(类型为"QWidget"(在线程 0x0x2071ab68"中创建,文件内核\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);
}

使用 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);
}