首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当QMenu的QWidgetAction被触发时,如何关闭它?

当QMenu的QWidgetAction被触发时,如何关闭它?
EN

Stack Overflow用户
提问于 2015-09-28 13:40:42
回答 1查看 1.2K关注 0票数 1

我有一个QMenu,我已经为它创建了一个QColorModel操作小部件(实际上它只是一个QStandardItemModel)。我想要的行为是,当用户单击模型中的某个颜色时,应该触发该操作,然后关闭菜单。然而,它似乎没有做到这一点,即使当我手动触发操作。

我已经尝试过手动隐藏菜单,但这是一个传说,因为它不会隐藏父菜单可能附加到哪个菜单。

下面是代码的相关部分:

代码语言:javascript
复制
// 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);

编辑

我还试着添加了这样的效果:

代码语言:javascript
复制
QMenu* menu = m_colorMenu;
do
{
    menu->close();
    menu = dynamic_cast<QMenu*>(menu->parent());
} while (menu);

但是它也很脆弱,因为它假设:( a)所有的小部件都有正确的父级,b)所有的父母实际上都应该是菜单。就我而言,他们不是。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-28 18:28:25

如果包含的菜单不在父级树中,并且要关闭的菜单不是顶级菜单,那么就没有简单的方法可以做到这一点。尽管如此,仍有:

核选择

将其添加到lambda函数的末尾

代码语言:javascript
复制
auto topLevelWidgets = qApp->topLevelWidgets();
for (auto widget : topLevelWidgets)
{
    QMenu* menu = dynamic_cast<QMenu*>(widget);
    if (menu)
    {
        menu->close();
    }
}

将导致所有顶级菜单在操作被触发后关闭。这是一种相对比较好的方式来完成您想要的事情,因为:

  1. 其中一个顶级菜单将包含相关菜单,并且
  2. 永远不要说从来没有,但我想不出有一个情况,你会有(或希望)一个以上的菜单打开一次,所以最有可能的唯一开放的菜单树,你将关闭的是预期的。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32824548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档