2011-02-24 19 views
17

Estoy usando QDockWidgets y colocando dos de ellas en el lado izquierdo de mi aplicación para que las pestañas se puedan usar para seleccionar entre ellas. 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.QDockWidget Tablas arrastrables

enter image description here

(Mis QDockWidgets son "Atributos" y "Biblioteca")

¿Hay una manera de deshacerse de esta segunda barra y que sea por lo que puede mover los QDockWidgets arrastrando las propias pestañas ?

Respuesta

0

has necesitado:

myDockingWidget->setTitleBarWidget(0) 

edición:

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

+0

No creo que funcione. Al menos no la última vez que lo intenté. :) El widget de la barra de título solo se usa cuando el widget dock está flotando. –

+0

Esto no hace nada. Los documentos de Qt para esta función incluso dicen que simplemente hará que regrese al widget de la barra de título por defecto. Podría configurarlo en mi propio widget de 0 altura, pero incluso entonces las pestañas no se podrán arrastrar. – Dwayne

0

Parece que ha establecido la posición de la pestaña de la plataforma para estar 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 propone en Qt (eliminar la barra de título 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 su lugar, le sugiero mover las pestañas a la parte inferior (consulte QMainWindow::setTabPosition) o posiblemente uno de los lados.

3

creo, Tom no estaba demasiado lejos de una solución:

Usted puede configurar su propio widget como barra de título:

myDockingWidget->setTitleBarWidget(myTitleBar) 

Si el diseño de este widget para no mostrar el título de la ventana muelle , lo tienes. A través de la señal QDockWidget::topLevelChanged su widget de acoplamiento puede incluso informarse, cuando se pone flotante, para que luego pueda habilitar el título en myTitleBar nuevamente.

+2

Esto no funcionará, elimina la "biblioteca" de texto del ejemplo, pero todavía no hay manera de obtener los eventos del mouse para que la pestaña la haga arrastrable. – paulm

2

Por lo que puedo ver desde QDockWidget::mousePressEvent aplicación en src/gui/widgets/qdockwidget.cpp arrastrando los dockwidgets el uso de pestañas es NO posible:

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 se puede ver en la puesta en práctica una de las cosas que los QDockWidget comprobaciones antes de permitir desacoplar es si el evento de la prensa del mouse proviene de la barra de título o no.

+0

¿es posible crear una subclase del widget y anular este comportamiento, por ejemplo, verificar si las coordenadas del cursor (¿relativo?) Están dentro del rectángulo de pestañas? – Ehouarn

4

Si está agregando QTabWidgets a una ventana principal derivada de QMainWindow, puede intentar tabifyDockWidget. Enumera dos QDockWidgets tal como lo desea y, por supuesto, puede arrastrarlos.

dockWidget1 = new QDockWidget("Tab1") ; 
dockWidget2 = new QDockWidget("Tab2") ; 
this->addDockWidget(Qt::LeftDockWidgetArea , dockWidget1); 
this->addDockWidget(Qt::LeftDockWidgetArea , dockWidget2); 
this->tabifyDockWidget(dockWidget1,dockWidget2); 
0

También creo que setTitleBarWidget() realmente hace el truco. Recuerdo haberlo visto con un propósito similar en el código fuente de Amarok music player. Amarok tiene un QMainWindow que solo contiene widgets de muelle. Es posible que desee echar un vistazo al código fuente allí.

Cuestiones relacionadas