QMainWindow 中的 QToolbar - 向工具栏发出其位置变化的信号

标签 qt orientation toolbar qpushbutton qtoolbar

我希望能够检测作为主窗口一部分的工具栏的位置和方向的任何变化。工具栏有一个名为 nodes_buttonQPushButton,并且是主窗口的一部分。我同时使用默认的QMainWindowQToolBarnodes_button 包含一个 QMenu,整个练习的目的是以视觉上适合工具栏的方式放置 nodes_button 的菜单指示器。

默认主窗口中的默认工具栏有 5 个可以放置的位置 - 顶部、底部、左侧、右侧和 float 。根据工具栏所在的区域,它还会将其方向更改为水平( float 、顶部和底部)或垂直(左或右)。

确定方向并不困难,因为工具栏实际上提供了QToolBar::orientation()(用于检索方向)和QToolBar::orientationChanged(Qt::Orientation)(每次工具栏方向改变时发出信号)。使用信号我可以连接这样的插槽:

connect(toolbar, SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(toolbarAdjust()));

目前 toolbarAdjust() 仅在工具栏方向更改时触发,但我也想在工具栏位置更改时使用它:

void MainWindow::toolbarAdjust()
{
  Qt::Orientation toolbarOrientation = toolbar->orientation();
  Qt::ToolBarArea toolbarPosition = this->toolBarArea(toolbar);

  if(toolbarOrientation == Qt::Horizontal) {
    if(toolbarPosition == Qt::NoToolBarArea || toolbarPosition == Qt::TopToolBarArea) {
      nodes->setStyleSheet("QPushButton#nodes_button::menu-indicator {image: url(:node_menu_top); subcontrol-position: bottom center; subcontrol-origin: padding; bottom: -7px}");
    }
    else if(toolbarPosition == Qt::BottomToolBarArea) {
      nodes->setStyleSheet("QPushButton#nodes_button::menu-indicator {image: url(:node_menu_bottom); subcontrol-position: top center; subcontrol-origin: padding; top: -7px}");
    }
  }
  else if (toolbarOrientation == Qt::Vertical) {
    if(toolbarPosition == Qt::LeftToolBarArea) {
      nodes->setStyleSheet("QPushButton#nodes_button::menu-indicator {image: url(:node_menu_right); subcontrol-position: left center; subcontrol-origin: padding; right: -6px;}");
    }
    else if(toolbarPosition == Qt::RightToolBarArea) {
      nodes->setStyleSheet("QPushButton#nodes_button::menu-indicator {image: url(:node_menu_left); subcontrol-position: right center; subcontrol-origin: padding; left: -6px;}");
    }
  }
}

由于多种原因,这并不总是有效,例如,因为对于左侧和右侧/顶部和底部工具栏区域,工具栏的方向是相同的 - 垂直/水平。

所以我需要类似的东西

connect(this, SIGNAL(toolbarLocationChanged()), this, SLOT(toolbarAdjust()));

使用工具栏的方向和位置,我可以以适合工具栏当前位置的方式放置菜单指示器。正如您在下面看到的,方向与样式表的相应变体相结合

QPushButton#nodes_button::menu-indicator {
  image: url(:node_menu_top);         // bottom, right, left
  subcontrol-position: bottom center; // top, right, left
  subcontrol-origin: padding;
  bottom: -7px                        // top, left, right
}

导致

enter image description here enter image description here enter image description here enter image description here

我实际上可以省略整个方向部分并执行以下操作:

void MainWindow::toolbarAdjust()
{
  Qt::ToolBarArea toolbarPosition = this->toolBarArea(drawingToolBar);

  switch(toolbarPosition) {
    case Qt::NoToolBarArea:;
    case Qt::TopToolBarArea:
      nodes->setStyleSheet("QPushButton#nodes_button::menu-indicator {image: url(:node_menu_top); subcontrol-position: bottom center; subcontrol-origin: padding; bottom: -7px}");
      break;
    case Qt::BottomToolBarArea:
      nodes->setStyleSheet("QPushButton#nodes_button::menu-indicator {image: url(:node_menu_bottom); subcontrol-position: top center; subcontrol-origin: padding; top: -7px}");
      break;
    case Qt::LeftToolBarArea:
      nodes->setStyleSheet("QPushButton#nodes_button::menu-indicator {image: url(:node_menu_right); subcontrol-position: left center; subcontrol-origin: padding; right: -6px;}");
      break;
    case Qt::RightToolBarArea:
      nodes->setStyleSheet("QPushButton#nodes_button::menu-indicator {image: url(:node_menu_left); subcontrol-position: right center; subcontrol-origin: padding; left: -6px;}");
      break;
  }
}

因为工具栏在停靠/ float 时的行为方式。

编辑: 我发现this post用户告诉OP有关QDockWidget::dockLocationChanged()的信息,并且也许这样的功能也已添加到QToolBar中。最后,OP 发布了一封电子邮件,表明已请求此类功能。该帖子是 2007 年的...

最佳答案

我发现QToolBar::topLevelChanged(bool)信号可以帮助我解决问题。每当用户想要更改工具栏的工具栏区域时,他/她必须单击工具栏,将其拖动到该区域,然后将其放下。基于 Qt 文档:

This signal is emitted when the floating property changes. The topLevel parameter is true if the toolbar is now floating; otherwise it is false.

因此,每当用户拖动工具栏时,它显然也是 float 的。一旦工具栏停靠,它就不会 float 。检测工具栏 float 属性的这种变化可用于调整其内容。

如果有人感兴趣的话,这是结果:

顶部位置(指示器向下)

enter image description here

底部放置(指示器指向上方)

enter image description here

左侧位置(指示器指向右侧)

enter image description here

正确放置(指示器指向左侧)

enter image description here

关于QMainWindow 中的 QToolbar - 向工具栏发出其位置变化的信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35990655/

相关文章:

java - 如何修复android工具栏中的重复项目(需要删除工具栏上的菜单项)?

qt - 如何检测 QEventLoop 中的挂起?

Qt:使用 QSharedMemory 的单实例应用程序

c++ - QT 图形绘图,如何更改 QGraphicsView 的坐标系/几何图形

ios - 如何使图像方向旋转 270 度 (swift3)

c# - Internet Explorer 工具栏的上下文菜单

qt - 调整pyqt tableview大小时如何裁剪列单元格的左侧

ios - React native 方向不起作用 ||锁定IOS

ios - 转换与更改 UIView 的框架?

iOS - 在 NavBar 和 PullToRefreslh 之间添加自定义工具栏