簡體   English   中英

觸發QWidgetAction時如何關閉QMenu?

[英]How do you close a QMenu when its QWidgetAction is triggered?

我有一個QMenu創建了QColorModel操作小部件的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();
    }
}

一旦觸發動作,將導致所有頂級菜單關閉。 這是完成您想要的事情的一種相對可行的方法,因為:

  1. 頂層菜單之一將包含相關菜單,並且
  2. 永遠不會說永遠不會,但我想不出一種情況,您一次會(或想要)打開多個菜單,因此,最有可能關閉的唯一打開菜單樹就是預期的菜單樹。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM