在我的QMenu中,我有一个子菜单,其中可能包含潜在的杂项,并且它并不总是使用,因此我考虑仅在需要时才将其初始化:

c++ - Qt QMenu延迟初始化-LMLPHP

我怀疑可以通过实现QAbstractItemModel并重写canFetchMore fetchMore方法来实现。

有没有更简单的方法使用一些技巧?我不介意它是否有点破烂(例如,在单击好菜单后替换一个虚拟菜单,或类似的东西)。

最佳答案

一种骇人听闻的方法,但在我的初始测试中效果很好,类似于:

//    menuBar->addMenu(Slow::APIMenu()); //old way

    auto emptyApiMenu = new QMenu("API");
    emptyApiMenu->addAction("API"); //dummy item to avoid qt warning of invisible menu
    QObject::connect(emptyApiMenu, &QMenu::aboutToShow, [=]() //lazy initialization of API menu
    {
        menuBar->insertMenu(emptyApiMenu->menuAction(), Slow::APIMenu());
        menuBar->removeAction(emptyApiMenu->menuAction());
    });
    menuBar->addMenu(emptyApiMenu);

它甚至可以打开最近生成的菜单,因此它是无缝的

09-06 13:58