2016-03-14 2 views
0

Я хотел бы иметь возможность обнаруживать любые изменения как положения, так и ориентации панели инструментов, которая является частью главного окна. Панель инструментов имеет 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 
} 

приводит к

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; 
    } 
} 

из-за того, как ведет себя панель инструментов, когда вы ее закрепляете/плаваете.

EDIT: Я нашел this post, где пользователь говорит ОП о QDockWidget::dockLocationChanged() и что, возможно, такая функциональность была добавлена ​​QToolBar тоже. В конце OP сообщение электронной почты, которое показывает, что такая функция была запрошена. Сообщение от 2007 ...

ответ

0

Я обнаружил, что сигнал QToolBar::topLevelChanged(bool) помогает мне решить эту проблему. Всякий раз, когда пользователь хочет изменить панель инструментов на панели инструментов, он должен щелкнуть по панели инструментов, перетащить ее в эту область и затем отбросить.На основе документации Qt:

Этот сигнал испускается при изменении свойства плавающего элемента. Параметр topLevel имеет значение true, если панель инструментов теперь плавает; в противном случае неверно.

Таким образом, всякий раз, когда пользователь перетаскивает панель инструментов, она также плавает. Как только панель инструментов состыкована, она не плавает. Обнаружение этого изменения плавающего свойства панели инструментов можно использовать для настройки его содержимого.

Вот результат, если кто интересуется:

Верхняя позиция (индикатор направлен вниз)

enter image description here

Bottom размещения (индикатор, указывающий вверх)

enter image description here

левого размещение (индикатор, указывающий на право)

enter image description here

Права размещения (индикатор, указывающий на слева)

enter image description here