Ответ 1
Наследовать QToolbar и переопределить contextMenuEvent()
.
В Qt, если я щелкнул правой кнопкой мыши на панели инструментов, отобразится меню, которое позволит мне скрыть панель инструментов. Мне нужно отключить эту функциональность, потому что я не хочу, чтобы панель инструментов была скрыта. Есть ли способ сделать это?
Наследовать QToolbar и переопределить contextMenuEvent()
.
Мне удалось установить ContextMenuPolicy непосредственно на панели инструментов (не в главном окне), если я использовал либо Qt::PreventContextMenu
, либо Qt::ActionsContextMenu
. Prevent
исключило контекстное меню и сделало щелчок правой кнопкой мыши, не влияя на панель инструментов, а Actions
сделал приятное контекстное меню, состоящее из действий, уже находящихся на моей панели инструментов. Qt::NoContextMenu
, похоже, не имеет никакого эффекта.
toolbar->setContextMenuPolicy(Qt::PreventContextMenu);
Используйте setContextMenuPolicy (Qt:: NoContextMenu) для главного окна панели инструментов.
Переопределить QMainWindow:: createPopupMenu(), например.
QMenu* MyApp::createPopupMenu()
{
QMenu* filteredMenu = QMainWindow::createPopupMenu();
filteredMenu->removeAction( mUnhidableToolBar->toggleViewAction() );
return filteredMenu;
}
Обратите внимание, что другие ответы, предлагающие отключить контекстное меню, будут работать только в том случае, если вы хотите отключить скрытие/показ всех панелей инструментов и всех виджетов док-станции.
Существует несколько способов добиться этого, не изменяя функциональность 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, либо если вы хотите удалить действие, посмотрите на ответ Стивена.