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

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


person Sergey Skoblikov    schedule 16.03.2009    source источник


Ответы (5)


Унаследуйте QToolbar и переопределите contextMenuEvent().

person Community    schedule 16.03.2009
comment
Просто чтобы внести свой вклад в ответ (5 лет спустя): вы можете избежать наследования, установив событие фильтра и сохранив событие (возвратить true): qt-project.org/doc/qt-5/eventsandfilters.html#event-filters - person cbuchart; 30.04.2014
comment
Этот ответ действительно выиграет от примера. - person Xeberdee; 10.04.2018

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

toolbar->setContextMenuPolicy(Qt::PreventContextMenu);

person Nolan Amy    schedule 26.01.2012
comment
Это работает, но вы должны знать, что вы предотвращаете появление контекстного меню только для этой одной панели инструментов. Если пользователь вызывает контекстное меню где-либо еще (например, на другой панели инструментов или в строке заголовка виджета док-станции), он все равно сможет скрыть вашу панель инструментов, которую нельзя скрыть. - person Thorbjørn Lindeijer; 29.10.2014

Используйте setContextMenuPolicy (Qt::NoContextMenu) для главного окна панели инструментов. .

person Ariya Hidayat    schedule 16.03.2009
comment
Привет, ты на stackoverflow. Привет, я фанат! - person ; 17.03.2009
comment
Я опечатался и исправил. NoContextMenu должен быть для главного окна, а не для панели инструментов. - person Ariya Hidayat; 18.03.2009
comment
Странно.. почему установка на самом QToolBar не работает? - person paulm; 11.02.2013
comment
Интересно, что если вы установите contextMenuPolicy панели инструментов на NoContextMenu, контекстное меню все равно появится. НО если вы установите его на CustomContextMenu и не реализуете функцию пользовательского контекстного меню, контекстное меню не появится... странно. - person waddlesplash; 06.10.2013

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

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

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

person Steven    schedule 24.05.2016
comment
Хороший, чистый ответ. Совет: Вы можете не отслеживать все добавленные панели инструментов, выполнив поиск 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, либо, если вы хотите удалить действие, посмотрите ответ Стивена.

person johnson    schedule 05.10.2016