当前位置: 首页 > wzjs >正文

陕西省建设教育培训中心网站网站建设结算方式

陕西省建设教育培训中心网站,网站建设结算方式,制作的大型网站多少钱,网站备案什么鬼例子,在Qt中,有一个右键菜单,我想把菜单中的节点改为章节。 这里要用到遍历函数: void traverseMenu(QMenu* menu, bool(*f)(QAction* a)) {assert(menu && f);// 遍历当前菜单的所有动作(QAction&#xff09…

例子,在Qt中,有一个右键菜单,我想把菜单中的节点改为章节。

这里要用到遍历函数:

void traverseMenu(QMenu* menu, bool(*f)(QAction* a))
{assert(menu && f);// 遍历当前菜单的所有动作(QAction)for (QAction* action : menu->actions()) {if (action->menu()) { // 如果是子菜单 traverseMenu(action->menu(),f); // 递归遍历}if (f(action)) return;}
}

然后traverseMenu用法如下:

qt.traverseMenu(&m, [](QAction* a)->bool {a->setText(a->text().replace("节点", "章节"));return false; //遍历全部
});

效果如下:

如果你要把 “彻底删除” 改为“CSDN”,可以这样:

qt.traverseMenu(&m, [](QAction* a)->bool {if (a->text() == "彻底删除") {a->setText("csdn");return true;  //结束遍历}return false;
});

现在重点来了,现在的每一种数据结构,都支持  for( auto& item: container),你可以把traverseMenu写成模板函数。

template<class T, class fun>
void traverse(const T& container,const fun& f) {for (auto& item : container) {if (f(item)) return;}
}

下面把“csdn” 改为 “彻底删除” 。

qt.traverse(m.actions(), [](QAction* a)->bool {if (a->text() == "csdn") {a->setText("彻底删除");return true;}return false;
});

但是如果子菜单中还有子菜单,则要自己检查Action中还有没有子菜单,这是模板函数的及限性。

if (action->menu()) {}

但是模板函数的通用性很强:

template<class T, class fun>
const T& traverse(T& container, const fun& f) {for (auto& item : container) {if (f(item)) return container;}return container;
}int main(int argc, char* argv[])
{QApplication a(argc, argv);  //注意,这里是QApplicationstd::vector<int> v = { 1,3,3,5,7 };std::list<std::string> s = { "abc","345","678","abc"};traverse(v, [](int& item)->bool {if (item == 3) {  //修改一个item = 2;return true;}return false;});traverse(s, [](std::string& item)->bool { if (item == "abc")  //修改所有item = "123";return false;  });for (auto& item : v) {std::cout << item;std::cout << "\t";}std::cout << "\n";for (auto& item : s) {std::cout << item;std::cout << "\t";}return a.exec();}

上次说过,这只是简单的遍历,还不如直接在代码中写一个循

环,但是在复杂的数据结构中,如树,图,你可能会发觉提早写

一个遍历函数很有用。

另:你可能要准备两个版本的traverse。

/// <summary>
/// 遍历,可修改原值
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="fun"></typeparam>
/// <param name="container"></param>
/// <param name="f"></param>
/// <returns></returns>
/// 创建时间: 2025-03-30      最后一次修改时间:2025-03-30
template<class T, class fun>
T& traverse(T& container,const fun& f) {for (auto& item : container) {if (f(item)) return container;}return container;
}/// <summary>
/// 遍历,不可修改源值
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="fun"></typeparam>
/// <param name="container"></param>
/// <param name="f"></param>
/// <returns></returns>
/// 创建时间: 2025-03-30      最后一次修改时间:2025-03-30
template<class T, class fun>
const T& traverse(const T& container, const fun& f) {for (const auto& item : container) {if (f(item)) return container;}return container;
}

在模板函数中为什么不用函数指针,例如:

template<class T, class value_type>
const T& traverse(T& container, bool (*f)(value_type item)) { ... }

因为使用函数指针有两个缺点:

(1)

  • value_type 需要正确推导为 QAction*,但编译器可能无法准确推断(特别是当 m.actions() 返回的类型较复杂时)。

  • 即使推导正确,某些编译器可能对 模板 + 函数指针 + lambda 隐式转换 的支持不够完善,导致报错。

(2)

    traverse 函数的第二个参数 是一个 函数指针,其类型是: 

        bool (*f)(value_type item)

               这意味着它只能接受 普通函数 或 无捕获的 lambda即 [] 内没有变量的 lambda)。

                除非你用 std::function,上次说过原因,下面A,B 两篇文章解释过

                A

                Qt控件中函数指针使用的最终版本,使用std::function函数指针使用

                B接上一主题,在Qt中,用信号代替函数指针,最终目标都是能直接使用lambda表达式,效果一样。-CSDN博客

   


 

               


文章转载自:

http://FgHTlrej.fLLfz.cn
http://Bm1uc8fx.fLLfz.cn
http://wQ6DeNcU.fLLfz.cn
http://XA9eshFG.fLLfz.cn
http://LHxGfEzy.fLLfz.cn
http://UJzQifpP.fLLfz.cn
http://E1rnH0OS.fLLfz.cn
http://R8AodBsp.fLLfz.cn
http://AOB94Yke.fLLfz.cn
http://kl2hH2nD.fLLfz.cn
http://3RK78Pf3.fLLfz.cn
http://fuGawu5H.fLLfz.cn
http://Qkd3UFMU.fLLfz.cn
http://hOEJc0tI.fLLfz.cn
http://5WqV1knZ.fLLfz.cn
http://0CU76a4Z.fLLfz.cn
http://Supw9w67.fLLfz.cn
http://EaKWTtbf.fLLfz.cn
http://02e1nL5D.fLLfz.cn
http://xeNTBiIj.fLLfz.cn
http://8O0ncpZ3.fLLfz.cn
http://WltiIXUR.fLLfz.cn
http://cGTkXRbI.fLLfz.cn
http://eGWqqWHk.fLLfz.cn
http://WkeQzF0F.fLLfz.cn
http://sZ9u0DAG.fLLfz.cn
http://Rhiqq6TY.fLLfz.cn
http://iUys5SaS.fLLfz.cn
http://kThB1T2w.fLLfz.cn
http://qMQDGSN8.fLLfz.cn
http://www.dtcms.com/wzjs/778306.html

相关文章:

  • 网站建设与维护一般需要多少钱每年文化事业建设费在哪个网站申报
  • 刚做网站做多用户还是单用户mysql 收费 网站建设
  • 网站开发nodejsseo排行榜年度10佳网站
  • 网站开发提案模板那些网站是vue做的
  • 旅游网站制作 价格广州电子商城网站
  • 哪家公司做企业网站外贸wordpress主题
  • 河北廊坊网站建设阳江做网站多少钱
  • 宁波网站开发公司电话网站收录地址
  • 北京平面设计网站莱芜雪野湖国际会议中心
  • 可以免费下源码的网站天津做网站建设公司
  • 网站托管找心馨人生珠海网站建设
  • 江西seo网站排名优化上海市建设工程检测培训中心
  • 白云区同和网站建设优秀网站网页设计
  • 网站建设市场前景wordpress改为QQ头像
  • 网站解析加速网站过期查询
  • 网站建设女装规划书宁波网站推广怎么做
  • 网站建设ASP心得体会win7一键优化工具
  • 网站后台信息发布这样做网站的提交重置按钮怎么做
  • p2p倒闭 网站开发手游平台
  • 智慧政务门户网站建设设计工作室经营范围
  • 无锡网站建设推广服务一个网站建设的组成
  • 吉大建设工程学院官方网站移动互联网开发的几种方式
  • 如何做网站怎么赚钱吗域名备案流程是什么
  • 附近的网站设计开发网站开发 工具
  • 酒泉市城乡建设局网站宁波建设网 提取业务
  • 凤翔做网站珠海特价做网站
  • 蚌埠网站建设哪家好wordpress composer
  • 网站美工和平面设计公司建设网站的通知书
  • php开发网站项目心得wordpress 采集都有哪些
  • 建设小游戏网站空间类型选择网线插座接法