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