有没有办法阻止工具栏的隐藏操作?

Ser*_*kov 19 c++ qt qtoolbar

在Qt中,如果我右键单击工具栏,将显示允许我隐藏工具栏的菜单.我需要禁用此功能,因为我不希望工具栏可以隐藏.有没有办法做到这一点?

Nol*_*Amy 29

我可以直接在工具栏(而不是主窗口)上设置ContextMenuPolicy ,只要我使用Qt::PreventContextMenu或者Qt::ActionsContextMenu.Prevent取消了上下文菜单并右键单击对工具栏没有任何影响,同时Actions创建了一个很好的上下文菜单,由我工具栏中的操作组成.Qt::NoContextMenu似乎没有任何影响.

toolbar->setContextMenuPolicy(Qt::PreventContextMenu);

  • 这样可行,但您必须注意,您只是阻止为此一个工具栏显示上下文菜单.如果用户在其他地方触发上下文菜单(例如在另一个工具栏或停靠小部件标题栏上),他仍然可以隐藏"不可识别的"工具栏. (5认同)

Ari*_*yat 17

使用setContextMenuPolicy(Qt :: NoContextMenu)作为工具栏的主窗口.

  • 我输了错误并纠正了它.NoContextMenu应该用于主窗口,而不是工具栏. (5认同)
  • 有趣的是,如果将工具栏的"contextMenuPolicy"设置为"NoContextMenu",则仍会显示上下文菜单.**但是**如果你将它设置为`CustomContextMenu`并且没有实现自定义上下文菜单功能,则不会出现上下文菜单......很奇怪. (4认同)
  • 奇怪..为什么在QToolBar上设置它本身不起作用? (3认同)

Ste*_*ven 9

覆盖QMainWindow :: createPopupMenu()例如

QMenu* MyApp::createPopupMenu()
{
  QMenu* filteredMenu = QMainWindow::createPopupMenu();
  filteredMenu->removeAction( mUnhidableToolBar->toggleViewAction() );
  return filteredMenu;
}
Run Code Online (Sandbox Code Playgroud)

请注意,建议禁用上下文菜单的其他答案仅在您要禁用所有工具栏和所有停靠窗口小部件的隐藏/显示时才有效.


joh*_*son 6

有几种方法可以实现这一点,而无需更改contextMenu功能.请参阅以下3个PySide示例:

1.禁用以下toggleViewAction内容QToolBar:

UnhidableToolBar = QToolBar()
UnhidableToolBar.toggleViewAction().setEnabled(False)
Run Code Online (Sandbox Code Playgroud)

2.连接visibilityChanged信号:

toolbar.visibilityChanged.connect(lambda: toolbar.setVisible(True))
Run Code Online (Sandbox Code Playgroud)

3.子类QToolBar并使用hideEvent:

class UnhideableQToolBar(QToolBar):
    def hideEvent(self, event):
        self.setVisibile(True)
Run Code Online (Sandbox Code Playgroud)

建议:

虽然2和3非常脏,但解决方案1在上下文菜单中显示工具栏,就像QDockWidget具有功能DockWidgetClosable集的工具栏一样.因此要么使用解决方案1,要么想要删除动作,请查看Steven的答案.


小智 4

继承QToolbar并重新实现contextMenuEvent()