Есть ли способ предотвратить операцию скрыть панель инструментов?

В Qt, если я щелкнул правой кнопкой мыши на панели инструментов, отобразится меню, которое позволит мне скрыть панель инструментов. Мне нужно отключить эту функциональность, потому что я не хочу, чтобы панель инструментов была скрыта. Есть ли способ сделать это?

Ответы

Ответ 1

Наследовать QToolbar и переопределить contextMenuEvent().

Ответ 2

Мне удалось установить ContextMenuPolicy непосредственно на панели инструментов (не в главном окне), если я использовал либо Qt::PreventContextMenu, либо Qt::ActionsContextMenu. Prevent исключило контекстное меню и сделало щелчок правой кнопкой мыши, не влияя на панель инструментов, а Actions сделал приятное контекстное меню, состоящее из действий, уже находящихся на моей панели инструментов. Qt::NoContextMenu, похоже, не имеет никакого эффекта.

toolbar->setContextMenuPolicy(Qt::PreventContextMenu);

Ответ 4

Переопределить QMainWindow:: createPopupMenu(), например.

QMenu* MyApp::createPopupMenu()
{
  QMenu* filteredMenu = QMainWindow::createPopupMenu();
  filteredMenu->removeAction( mUnhidableToolBar->toggleViewAction() );
  return filteredMenu;
}

Обратите внимание, что другие ответы, предлагающие отключить контекстное меню, будут работать только в том случае, если вы хотите отключить скрытие/показ всех панелей инструментов и всех виджетов док-станции.

Ответ 5

Существует несколько способов добиться этого, не изменяя функциональность contextMenu. См. Следующие 3 примера PySide:

1. Отключите toggleViewAction QToolBar:

UnhidableToolBar = QToolBar()
UnhidableToolBar.toggleViewAction().setEnabled(False)

2. Подключитесь к сигналу visibilityChanged:

toolbar.visibilityChanged.connect(lambda: toolbar.setVisible(True))

3. Подкласс QToolBar и используйте hideEvent:

class UnhideableQToolBar(QToolBar):
    def hideEvent(self, event):
        self.setVisibile(True)

Рекомендация:

В то время как 2 и 3 довольно грязные, решение 1 показывает панель инструментов в контекстном меню, как QDockWidget, у которой есть функция DockWidgetClosable. Поэтому либо используйте решение 1, либо если вы хотите удалить действие, посмотрите на ответ Стивена.