Ctk:使用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<Users>)

發送消息

void publish()
{
    // 獲取插件上下文
    ctkPluginContext* context = ctkPluginFrameworkLauncher::getPluginContext();
    ctkServiceReference ref = context->getServiceReference<ctkEventAdmin>();
    if (ref)
    {
        ctkEventAdmin* eventAdmin = context->getService<ctkEventAdmin>(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<Users> 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<Users>  recvInfo = event.getProperty("User").value<QVector<Users>>();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章