c++ - QDockWidget Pestañas arrastrables
qt user-interface (6)
Parece que has configurado la posición de la pestaña del muelle para que esté en la parte superior. El valor predeterminado es que esté en la parte inferior. Entonces no es tan desagradable visualmente tener el texto de la pestaña al lado del texto de la barra de título.
No creo que haya ninguna manera de hacer lo que QDockWidget
en Qt (eliminar la QDockWidget
título de QDockWidget
y arrastrar desde la pestaña), al menos no con los widgets estándar. Probablemente puedas escribir una gran cantidad de código personalizado para hacerlo realidad, pero eso probablemente no valga la pena.
En cambio, sugiero mover las pestañas a la parte inferior (ver QMainWindow::setTabPosition
) o posiblemente uno de los lados.
Estoy usando QDockWidgets y colocando dos de ellos en el lado izquierdo de mi aplicación para que se puedan usar pestañas para seleccionar entre ellos. Sin embargo, el comportamiento predeterminado de Qt para esto se ve horrible y no es intuitivo. En lugar de poder arrastrar las pestañas para mover los widgets, coloca otra barra debajo de la pestaña seleccionada (con el mismo nombre) que debe arrastrarse en su lugar. Como usuario, sería difícil resolver esto.
(Mis QDockWidgets son "Atributos" y "Biblioteca")
¿Hay alguna manera de deshacerse de esta segunda barra y hacer que pueda mover mis QDockWidgets arrastrando las pestañas?
has probado:
myDockingWidget->setTitleBarWidget(0)
editar:
QWidget* titleWidget = new QWidget(this);
mUi.dockWidget->setTitleBarWidget(titleWidget);
donde ''esto'' es un QMainWindow
esto eliminará la barra de título, aunque no estoy seguro de cómo hacer que el QDockWidget se pueda arrastrar desde las pestañas
Creo que Tom no estaba muy lejos de una solución:
Puede configurar su propio widget como barra de título:
myDockingWidget->setTitleBarWidget(myTitleBar)
Si diseña este widget para que no muestre el título de la ventana de acoplamiento, lo tiene. A través de la señal QDockWidget::topLevelChanged
tu widget de acoplamiento puede incluso informarse, cuando se vuelve flotante, para que luego puedas habilitar el título en myTitleBar
nuevamente.
Por lo que puedo ver desde la QDockWidget::mousePressEvent
de QDockWidget::mousePressEvent
en src/gui/widgets/qdockwidget.cpp
no es posible arrastrar los dockwidgets usando pestañas:
QDockWidgetLayout *dwLayout
= qobject_cast<QDockWidgetLayout*>(layout);
if (!dwLayout->nativeWindowDeco()) {
QRect titleArea = dwLayout->titleArea();
if (event->button() != Qt::LeftButton ||
!titleArea.contains(event->pos()) ||
// check if the tool window is movable... do nothing if it
// is not (but allow moving if the window is floating)
(!hasFeature(this, QDockWidget::DockWidgetMovable) && !q->isFloating()) ||
qobject_cast<QMainWindow*>(parent) == 0 ||
isAnimating() || state != 0) {
return false;
}
initDrag(event->pos(), false);
....
Como puede ver en la implementación, una de las cosas que QDockWidget
verifica antes de permitir el desacoplamiento es si el evento de la prensa del mouse proviene de la barra de título o no.
Si está agregando QTabWidgets
a una ventana principal derivada de QMainWindow
, puede intentar tabifyDockWidget
. Enumera dos QDockWidgets
tal como querías y, por supuesto, puedes arrastrarlos.
dockWidget1 = new QDockWidget("Tab1") ;
dockWidget2 = new QDockWidget("Tab2") ;
this->addDockWidget(Qt::LeftDockWidgetArea , dockWidget1 );
this->addDockWidget(Qt::LeftDockWidgetArea , dockWidget2 );
this->tabifyDockWidget(dockWidget1,dockWidget2);
También creo que setTitleBarWidget()
realmente hace el truco. Recuerdo haberlo visto con un propósito similar en el código fuente del reproductor de música Amarok . Amarok tiene un QMainWindow que solo contiene widgets de muelle. Es posible que desee echar un vistazo al código fuente allí.