// qt includes #include #include #include #include #include #include void AboutToShow( QMenu* pMenu ) { // randomly assign some to not visible for ( int a = 0; a < pMenu->actions().size(); a++ ) { bool isVisible = (rand() % 4) > 0; pMenu->actions().at( a )->setVisible( isVisible ); } // question posted to: https://forum.qt.io/topic/68765/how-to-update-geometry-on-qaction-visibility-change-in-qmenu-abouttoshow // attempt to update the geometry/placement of the menu //pMenu->parentWidget()->updateGeometry(); // doesn't work //pMenu->parentWidget()->update(); // doesn't work //pMenu->parentWidget()->updateGeometry(); // doesn't work //pMenu->parentWidget()->adjustSize(); // doesn't work //pMenu->parentWidget()->ensurePolished(); // doesn't work //pMenu->update(); // doesn't work //pMenu->updateGeometry(); // doesn't work //pMenu->adjustSize(); // doesn't work //pMenu->ensurePolished(); // doesn't work //pMenu->adjustSize(); // doesn't work //pMenu->parentWidget()->adjustSize(); // doesn't work //pMenu->parentWidget()->layout()->invalidate(); // no layout present //pMenu->layout()->invalidate(); // no layout present } int main(int argc, char *argv[]) { // setup application QApplication app(argc, argv); QMainWindow mainWin; mainWin.setMinimumSize( 500, 250 ); mainWin.move( 1000, 1450 ); // low down // set up menus int numMenus = rand() % 5 + 3; int actionCount = 0; for ( int m = 0; m < numMenus; m++ ) { QMenu* pMenu = mainWin.menuBar()->addMenu( QString().sprintf( "Menu %d", m ) ); // add actions int numActions = rand() % 10 + 5; for ( int a = 0; a < numActions; a++ ) { QAction* pAction = pMenu->addAction( QString().sprintf( "Action %d", actionCount++ ) ); } app.connect( pMenu, &QMenu::aboutToShow, [=]() { AboutToShow( pMenu ); } ); } // show and display mainWin.show(); int result = app.exec(); return result; }