如何使用带有Qt和C++的"Interface Class"进行通信
How communicate two thread, using a "Interface Class" with Qt and C++
我正在使用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);
}
相关文章:
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- "Undefined class"作为is_base_of的论据
- 如何将class.cpp和class.hpp编译为一个.o文件
- Android NDK 编译 LAME HAVE_MPGLIB > 'interface.h' 文件未找到
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- '{'标记之前的预期类名,然后在预声明时无效使用不完整的类型'class class_name'
- 如何使用"derived input class"创建派生类?
- 错误:"Left of getValue must have class/struct/union"
- ' class a : b ' 和 ' class a : public b ' 之间的继承类不同
- Pybind11 Class Definition
- 在C++中使用没有合作伙伴Class/Cpp文件的头文件是否实用
- C2011 'CMemDC':Visual Studio 2019中的'class'类型重新定义
- TypeError: [c++ addon class] 不是构造函数
- C++ class template
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- Clearing Class Foo with new(pFoo) Foo()
- 如何使用带有Qt和C++的"Interface Class"进行通信
- Qt interface class