Я хотел бы иметь возможность обнаруживать любые изменения как положения, так и ориентации панели инструментов, которая является частью главного окна. Панель инструментов имеет QPushButton
под названием nodes_button и является частью главного окна. Я использую оба значения по умолчанию: QMainWindow
и QToolBar
. nodes_button содержит QMenu
, и цель всего этого упражнения состоит в том, чтобы поместить указатель меню nodes_button таким образом, который визуально соответствует панели инструментов.QToolbar в QMainWindow - панель инструментов сигнала о ее изменении позиции
Панель инструментов по умолчанию в главном окне по умолчанию имеет 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;
}
}
из-за того, как ведет себя панель инструментов, когда вы ее закрепляете/плаваете.
EDIT: Я нашел this post, где пользователь говорит ОП о QDockWidget::dockLocationChanged()
и что, возможно, такая функциональность была добавлена QToolBar
тоже. В конце OP сообщение электронной почты, которое показывает, что такая функция была запрошена. Сообщение от 2007 ...