当QWidgetAction被触发时,如何关闭QMenu ?
How do you close a QMenu when its QWidgetAction is triggered?
我有一个QMenu
,我已经创建了一个QColorModel
动作小部件(它实际上只是一个QStandardItemModel
)。我期望的行为是,当用户单击模型中的一种颜色时,应该触发该操作,并关闭菜单。然而,它似乎不这样做,即使我手动触发动作。
我已经尝试手动隐藏菜单,但这是一个拼凑,因为它不会隐藏父菜单,该菜单可能附加到。
下面是相关的代码:
// color menu
m_colorMenu = new QMenu("color", this);
m_colorView = new QColorView(m_colorMenu);
m_colorViewAction = new QWidgetAction(m_colorMenu);
m_colorViewAction->setDefaultWidget(m_colorView);
m_colorView->setModel(new QStandardColorModel);
connect(m_colorView, &QColorView::clicked, [&](QModelIndex index)
{
QColor color = qvariant_cast<QColor>(index.data(Qt::DecorationRole));
if (m_pen.color() != color)
{
m_pen.setColor(color);
drawIcon();
drawColorIcon();
update();
}
//this->hide(); // kludge, didn't close all parent menus
m_colorViewAction->trigger(); // doesn't seem to cause menu closure
});
m_colorMenu->addAction(m_colorViewAction);
<标题>编辑我也试过添加一些东西来达到:
的效果QMenu* menu = m_colorMenu;
do
{
menu->close();
menu = dynamic_cast<QMenu*>(menu->parent());
} while (menu);
,但它也很脆弱/笨拙,因为它假设a)所有的小部件都是正确的父组件,b)所有的父组件实际上应该是菜单。
标题>如果包含的菜单不在父树中,并且您想要关闭的菜单不是顶层菜单,则没有简单的方法可以做到这一点。也就是说,有:
核选项
将此添加到lambda函数的末尾
auto topLevelWidgets = qApp->topLevelWidgets();
for (auto widget : topLevelWidgets)
{
QMenu* menu = dynamic_cast<QMenu*>(widget);
if (menu)
{
menu->close();
}
}
一旦动作被触发,将导致所有顶级菜单关闭。这是实现您想要的功能的一种相对OK的方法,因为:
- 其中一个顶级菜单将包含有问题的菜单,而
- 永远不要说不,但我想不出一个单一的情况下,你会(或想要)一个以上的菜单打开一次,所以最有可能的唯一打开的菜单树,你会关闭是预期的一个。
相关文章:
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 关闭||运算符优化
- C++在变量给定的指定时间内关闭电脑
- Python中的for循环与C++有何不同
- 确保流程关闭
- Qt Q串行端口未编程设备未关闭
- 如何正确关闭升压线程
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 我的二进制搜索程序只是关闭了
- 在C++中释放内存期间,迭代器与指针有何不同
- 在不知道套接字的情况下关闭网络连接
- 防止组合框被关闭
- 按回车键后输出屏幕关闭
- SIGSEGV on Boost UDP 套接字关闭 - tcache_get at malloc.c.
- 通过安装信号处理程序关闭多线程应用程序
- 自定义对话框(源自QDialog)不会关闭(Android)
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- C++ - 为什么我的程序在再次调用函数后关闭?
- 防止 QMenu 在未触发其 QAction 之一时关闭
- 当QWidgetAction被触发时,如何关闭QMenu ?