diff --git a/cockatrice/src/game/player/player_manager.cpp b/cockatrice/src/game/player/player_manager.cpp index d8c12cee6..e283d2196 100644 --- a/cockatrice/src/game/player/player_manager.cpp +++ b/cockatrice/src/game/player/player_manager.cpp @@ -60,6 +60,7 @@ void PlayerManager::removePlayer(int playerId) emit playerRemoved(player); emit playerCountChanged(); players.remove(playerId); + player->deleteLater(); } Player *PlayerManager::getPlayer(int playerId) const diff --git a/cockatrice/src/tabs/tab_game.cpp b/cockatrice/src/tabs/tab_game.cpp index a07430dbb..c31f548d6 100644 --- a/cockatrice/src/tabs/tab_game.cpp +++ b/cockatrice/src/tabs/tab_game.cpp @@ -650,14 +650,6 @@ void TabGame::notifyPlayerKicked() msgBox.exec(); } -void TabGame::processPlayerLeave(Player *leavingPlayer) -{ - QString playerName = "@" + leavingPlayer->getPlayerInfo()->getName(); - removePlayerFromAutoCompleteList(playerName); - - scene->removePlayer(leavingPlayer); -} - Player *TabGame::addPlayer(Player *newPlayer) { QString newPlayerName = "@" + newPlayer->getPlayerInfo()->getName(); @@ -707,6 +699,31 @@ void TabGame::addLocalPlayer(Player *newPlayer, int playerId) } } +void TabGame::processPlayerLeave(Player *leavingPlayer) +{ + QString playerName = "@" + leavingPlayer->getPlayerInfo()->getName(); + removePlayerFromAutoCompleteList(playerName); + + scene->removePlayer(leavingPlayer); + + // When we inserted the playerMenu into the gameMenu earlier, Qt wrapped the playerMenu into a QAction*, which lives + // independently and does not get cleaned up when the source menu gets destroyed. We have to manually clean here. + if (leavingPlayer->getPlayerMenu()) { + QMenu *menu = leavingPlayer->getPlayerMenu()->getPlayerMenu(); + if (menu) { + // Find and remove the QAction pointing to this menu + QList actions = gameMenu->actions(); + for (QAction *act : actions) { + if (act->menu() == menu) { + gameMenu->removeAction(act); + delete act; // deletes the QAction wrapper around the submenu + break; + } + } + } + } +} + void TabGame::processRemotePlayerDeckSelect(QString deckList, int playerId, QString playerName) { DeckList loader;