Qt 实现消息和槽动态绑定

前一段时间写过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解析实现对象创建和槽函数创建传递,红色部分为代码中比较关键的部分

扫描二维码关注公众号,回复: 2429086 查看本文章

猜你喜欢

转载自blog.csdn.net/u012453032/article/details/79716772