波塞冬~ 2023-10-25 17:33 采纳率: 50%
浏览 2
已结题

QPlugin自定义信号

使用QPlugin的时候,我有如下定义,我希望让开发者传递BasicServerObject类进接口,然后在库里面触发该类的信号,由外部捕获。

class BasicServerObject : public QObject
{
    Q_OBJECT
Q_SIGNALS:
    void recvResponse(QByteArray array);
};

class BasicServiceInterface
{
public :
    virtual void setCallBackObject(BasicServerObject *) = 0;
};

外部开发者使用代码

        BasicServiceInterface *face = qobject_cast<BasicServiceInterface *>(instance);
        BasicServerObject *m_obj = new BasicServerObject;
        face->setCallBackObject(m_obj);
        connect(m_obj,&BasicServerObject::recvResponse,
                this,&MainWindow::onRecvResponse);

出现了我库里面一旦触发该信号,马上异常

emit m_callbackObject->recvResponse(array);
symbol lookup error: /libBasicServicePlugin.so: undefined symbol: _ZN17BasicServerObject12recvResponseE10QByteArray

其他接口是正常使用。
麻烦有经验的帮忙看下,在插件如何解决和设计自定义信号的问题,传入函数指针应该是可以把值回给开发者,但是我希望是信号的形式触发。
这个接口类也没办法继承QObject并定义信号,虽然能编译的过去,但是会导入失败。

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-25 20:07
    关注

    【以下回答由 GPT 生成】

    问题的根本原因是无法在接口类BasicServiceInterface中定义信号,因为接口类无法继承QObject。为了解决这个问题,可以使用另外一种方法来实现信号的传递:

    1. 在BasicServiceInterface中添加一个函数setRecvResponseCallback,该函数用来设置接收返回值的回调函数,并将回调函数的指针作为参数传入。
    class BasicServiceInterface
    {
    public:
        typedef void (*RecvResponseCallback)(QByteArray array);
        virtual void setRecvResponseCallback(RecvResponseCallback callback) = 0;
    };
    
    1. 在BasicServerObject中定义一个静态指针变量和一个静态函数,用来保存以及调用回调函数。
    class BasicServerObject : public QObject
    {
        Q_OBJECT
    public:
        static BasicServerObject *m_instance;
    
        static void recvResponseCallback(QByteArray array) {
            if (m_instance) {
                emit m_instance->recvResponse(array);
            }
        }
    
    public Q_SIGNALS:
        void recvResponse(QByteArray array);
    };
    
    1. 在插件中实现BasicServiceInterface类的setRecvResponseCallback函数,将回调函数保存到BasicServerObject类的静态指针变量中。
    void PluginClass::setRecvResponseCallback(RecvResponseCallback callback) {
        BasicServerObject::m_instance = this;
        BasicServerObject::m_instance->setRecvResponseCallback(callback);
    }
    
    1. 外部开发者使用以下代码进行连接:
    BasicServiceInterface *face = qobject_cast<BasicServiceInterface *>(instance);
    BasicServerObject::RecvResponseCallback callback = [](QByteArray array){
        // 处理接收到的返回值
    };
    face->setRecvResponseCallback(callback);
    

    这样就可以通过回调函数的方式实现信号的传递,外部代码可以捕获到返回值。使用这种方法不需要在接口类中定义信号,也不会出现符号查找错误的问题。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月2日
  • 已采纳回答 10月25日
  • 创建了问题 10月25日

悬赏问题

  • ¥15 公交车和无人机协同运输
  • ¥15 stm32代码移植没反应
  • ¥15 matlab基于pde算法图像修复,为什么只能对示例图像有效
  • ¥100 连续两帧图像高速减法
  • ¥15 组策略中的计算机配置策略无法下发
  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据
  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
  • ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)