QMainWindow 中的 QToolbar - 关于其位置变化的信号工具栏
QToolbar in QMainWindow - signal toolbar about its position change
我希望能够检测到作为主 window 一部分的工具栏的位置和方向的任何变化。工具栏有一个名为 nodes_button 的 QPushButton
,它是主 window 的一部分。我同时使用默认的 QMainWindow
和 QToolBar
。 nodes_button 包含一个 QMenu
,整个练习的目的是放置 nodes_button[=58= 的菜单指示器] 在视觉上适合工具栏的方式。
默认主菜单中的默认工具栏 window 有 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
}
导致
我实际上可以省略整个方向部分并执行以下操作:
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;
}
}
因为停靠工具栏时工具栏的行为方式 it/float。
编辑:
我发现 this post 用户告诉 OP 关于 QDockWidget::dockLocationChanged()
并且可能这样的功能也已添加到 QToolBar
中。最后,OP post 一封电子邮件显示已请求此类功能。 post 来自 2007...
我发现 QToolBar::topLevelChanged(bool)
信号帮助我解决了问题。每当用户想要更改工具栏的工具栏区域时 he/she 必须单击工具栏,将其拖到该区域然后放下。基于 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.
所以每当用户拖动工具栏时,它显然也是浮动的。一旦工具栏停靠,它就不会浮动。在工具栏的浮动 属性 中检测到此变化可用于调整其内容。
如果有人感兴趣,这里是结果:
顶部位置(指示器指向下方)
底部放置(指标指向上方)
左侧放置(指针指向右侧)
正确放置(指示器指向左侧)
我希望能够检测到作为主 window 一部分的工具栏的位置和方向的任何变化。工具栏有一个名为 nodes_button 的 QPushButton
,它是主 window 的一部分。我同时使用默认的 QMainWindow
和 QToolBar
。 nodes_button 包含一个 QMenu
,整个练习的目的是放置 nodes_button[=58= 的菜单指示器] 在视觉上适合工具栏的方式。
默认主菜单中的默认工具栏 window 有 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
}
导致
我实际上可以省略整个方向部分并执行以下操作:
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;
}
}
因为停靠工具栏时工具栏的行为方式 it/float。
编辑:
我发现 this post 用户告诉 OP 关于 QDockWidget::dockLocationChanged()
并且可能这样的功能也已添加到 QToolBar
中。最后,OP post 一封电子邮件显示已请求此类功能。 post 来自 2007...
我发现 QToolBar::topLevelChanged(bool)
信号帮助我解决了问题。每当用户想要更改工具栏的工具栏区域时 he/she 必须单击工具栏,将其拖到该区域然后放下。基于 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.
所以每当用户拖动工具栏时,它显然也是浮动的。一旦工具栏停靠,它就不会浮动。在工具栏的浮动 属性 中检测到此变化可用于调整其内容。
如果有人感兴趣,这里是结果:
顶部位置(指示器指向下方)
底部放置(指标指向上方)
左侧放置(指针指向右侧)
正确放置(指示器指向左侧)