动态创建菜单项,每次添加的菜单栏不一样,需要根据列表动态添加菜单项
一开始我采用的方式:
此方式内存一直在增加,没有减少
QList<QAction*> actions = menu->findChildren<QAction*>();
//删除所有的action 因为需要重新添加(每次的 菜单action 可能 都不一样)
for (auto& action : actions)
{
menu->removeAction(action);
}
翻译:删除菜单的所有操作。由菜单拥有且未显示在任何其他小部件中的操作将被删除。
源码:
看过源码,我们很清楚的 知道 里面调用了 delete 释放掉了 action,这就是为什么前面写removeAction没有释放掉空间的原因
void CarveWidget::SetMenuAction(QMenu* menu, QStringList list, QToolButton* toolbutton)
{
//此时不能判断 list 大小等于0 的情况,因为 当为0 的时候菜单还需要删减
if (list.size() < 0 || NULL == menu || NULL == toolbutton)
return;
//清空原有菜单
menu->clear();
//添加菜单项
for (int i = 0; i < list.size(); ++i)
{
QString str = list.at(i);
if (str.contains(tr("全部撤销")))
{
QAction* action = new QAction(list.at(i), menu );
menu->addSeparator();
menu->addAction(action);
connect(action, &QAction::triggered, this, [=]() {
EmitNumberTest(i);
});
}
else
{
QAction* action = new QAction(list.at(i), menu );
menu->addAction(action);
connect(action, &QAction::triggered, this, [=]() {
EmitNumber(i + 1);
});
}
}
toolbutton->setMenu(menu);
}