Ctk:使用sendEvent传递自定义类型的数据

Ctk:使用sendEvent传递自定义类型的数据

    • 举例:使用sendEvent传递结构体数据。
      • 声明结构体
      • 注册自定义类型
      • 发送消息
      • 接收消息

使用Ctk插件框架开发项目的时候,经常需要使用Ctk提供的插件之间消息通信机制,sendEvent()和postEvent()是常用的两种方式。

使用ctkDictionary承载我们想要传递数据的载体。ctkDictionary本质是一个QHash。现在就问题就变成了如果将自定义数据存储到QVariant中。见 QVariant::fromValue()接口。

Typedefs 
typedef QHash< QString, QVariant > 	ctkDictionary

举例:使用sendEvent传递结构体数据。

声明结构体

struct Users
{
    QString JobNomber;
    QString Name;
    QString PassWd;
    QString Department;
    QString Role;
    QString InService;
    QString Description;
};

注册自定义类型

Q_DECLARE_METATYPE(Users)
Q_DECLARE_METATYPE(QVector)

发送消息

void publish()
{
    // 获取插件上下文
    ctkPluginContext* context = ctkPluginFrameworkLauncher::getPluginContext();
    ctkServiceReference ref = context->getServiceReference();
    if (ref)
    {
        ctkEventAdmin* eventAdmin = context->getService(ref); 
        ctkDictionary props;
        
        Users user;
        user.JobNomber = "007";
        user.Name = "hsp";
        user.PassWd = "888168";
        user.Department = QString::fromLocal8Bit("技术中心");
        user.Role = QString::fromLocal8Bit("管理员");
        user.InService = "1";
        user.Description = "this is Test";
        
        QVector vec;
        vec.append(user);       
        props["User"] = QVariant::fromValue(vec);	//将vec存储到QVariant中
        ctkEvent event("org/commontk/DatabaseManager/published/AddUser", props);
        eventAdmin->sendEvent(event);
}

接收消息

void DatabaseManagerImpl::handleEvent(const ctkEvent &event)
{
    if(event.getTopic().contains("AddUser" , Qt::CaseInsensitive))
    {
        QVector  recvInfo = event.getProperty("User").value>();
    }
}

你可能感兴趣的:(C,C++编程技巧,Qt编程)