c++ qt user-interface qt4 tabs

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í.