前一段时间写过Qt通过反射和配置文件实现对象动态创建的例子,下面写下对象和槽函数之间实现动态绑定:
下面贴三段代码:
第一段槽函数实现类注册
WorkSpaceWidget::WorkSpaceWidget(QWidget *p)
{
InitWorkSpaceWidget();
//ObjectWidgetFactory<QDialog>::registerClass<QDialog>();
ObjectWidgetFactory<QDialog>::registerClass<ProjectCloseWidget>();
ObjectWidgetFactory<QDialog>::registerClass<CreMemDatSouWidget>();
ObjectWidgetFactory<QDialog>::registerClass<OpenMySQL>();
ObjectWidgetFactory<QDialog>::registerClass<CloseWorkspace>();
ObjectWidgetFactory<QDialog>::registerClass<SaveWorkSpace>();
ObjectWidgetFactory<QDialog>::registerClass<CreDataSoureSqlDialog>();
ObjectWidgetFactory<QDialog>::registerClass<OpenSQLDSDialog>();
}
槽函数实现:
void WorkSpaceWidget::popModelWindows()
{
auto actionsobj = qobject_cast<QAction *>(sender());
auto CurrentName = actionsobj->data().toString();
if (0 == CurrentName.compare("runOpenWSModelWindows"))
{
runOpenWSModelWindows();
return;
}
if(0 == CurrentName.compare("runOpenDSModelWindows"))
{
runOpenDSModelWindows();
return;
}
if (0 == CurrentName.compare("runCreateDSModelWindows"))
{
runCreateDSModelWindows();
return;
}
auto dockwidget = ObjectWidgetFactory<QDialog>::createObject(CurrentName);
dockwidget->show();
}
消息与槽实现绑定:
void WorkSpaceWidget::CreateSpaceAction()
{
//创建菜单、菜单项
auto pop_menu = new QMenu();
std::vector<std::string> itemName = { "打开文件型工作空间...","打开Oracle工作空间...","打开SQL Server工作空间...",
"保存工作空间","另存工作空间","关闭工作空间","删除工作空间","发布服务...","上传工作空间","下载工作空间"
,"打开所在文件夹","属性"};
std::vector<QString> objActionStr = { "runOpenWSModelWindows","QDialog",
"OpenMySQL","SaveWorkSpace","QDialog",
"CloseWorkspace","QDialog","QDialog",
"QDialog","QDialog"
,"QDialog","QDialog"};
std::vector<QAction *> tempdata;
int itemNum = 0;
std::for_each(itemName.begin(), itemName.end(), [&](std::string & str) {
auto add_Folder_action = new QAction(QString::fromLocal8Bit(str.c_str()), this);
tempdata.push_back(add_Folder_action);
pop_menu->addAction(add_Folder_action);
if (2==itemNum || 8==itemNum || 9==itemNum)
{
pop_menu->addSeparator();
}
itemNum++;
});
itemNum = 0;
std::for_each(tempdata.begin(), tempdata.end(), [&](std::vector<QAction *>::value_type act)
{
//连接信号与槽
act->setData(objActionStr[itemNum]);
connect(act, SIGNAL(triggered()), this, SLOT(popModelWindows()));
itemNum++;
});
pop_menu->exec(QCursor::pos());
pop_menu->show();
}
代码端中黄色部分可以实现在配置里面通过xml解析实现对象创建和槽函数创建传递,红色部分为代码中比较关键的部分