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>>();
}
}