QMainWindow中的QToolbar - 关于其位置变化的信号工具栏

时间:2016-03-14 14:46:08

标签: qt orientation toolbar qpushbutton qtoolbar

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

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

确定方向并不困难,因为工具栏实际上提供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;
  }
}

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

修改 我找到this post用户告诉OP有关QDockWidget::dockLocationChanged()的内容,并且可能已将此类功能添加到QToolBar。最后,OP发布了一封电子邮件,表明已经请求了这样的功能。该帖子来自2007年......

1 个答案:

答案 0 :(得分:0)

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

  

浮动属性发生变化时会发出此信号。该   如果工具栏现在是浮动的,则topLevel参数为true;除此以外   这是假的。

因此,每当用户拖动工具栏时,它显然也是浮动的。工具栏停靠后,它不会浮动。检测工具栏浮动属性中的此更改可用于调整其内容。

如果有兴趣的话,结果如下:

最高排名(指标向下)

enter image description here

底部放置(指示器向上)

enter image description here

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

enter image description here

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

enter image description here