2011-05-30 15 views
7

Tengo un problema con QTabBar/QTabWidget. Esto es lo que mi programa se parece por el momento, el uso de QTabBar:Widget en una QTabBar con marco no deseado

enter image description here

Como se puede ver, hay una línea entre el antiestético QTabBar y la QScrollArea por debajo de ella. Esta línea es parte del marco de la QScrollArea, de la que no puedo deshacerme simplemente, porque es necesaria en los otros tres lados. Me doy cuenta de que podría usar QTabWidget, pero luego tendría que crear un widget para cada pestaña, lo cual no es posible aquí: el contenido de QScrollArea cambia según la pestaña seleccionada, pero solo hay un widget QScrollArea. (Duplicación de que cada vez que se crea una nueva pestaña haría que sus propios problemas.)

Así que ¿alguien sabe una forma de ya sea:
(i) contar la QScrollArea para dibujar un marco sin la línea superior; o
(ii) use el mismo widget para cada pestaña en un QTabWidget?

Actualización 3 Para otro enfoque, vea mi respuesta a continuación.

Actualización 1 He implementado la sugerencia de zvezdi, y la línea antiestética ha desaparecido:

enter image description here

Esta es una mejora. Pero no es correcto. Mire los espacios entre las barras de desplazamiento y el borde. A la derecha, son dos píxeles en lugar de uno; en la parte inferior, es tres píxeles. Y el espacio a la derecha entre el borde QScrollArea y el borde del widget principal es un píxel demasiado grande. Esto se debe al estilo de borde de QTabWidget, que estoy perdiendo la cordura tratando de cambiar. Si digo:

MyTabWidget -> setStyleSheet ("QTabWidget::pane { margin: 0px,0px,0px,0px }") ; 

entonces los márgenes parecen tener razón, pero las fronteras desaparecen:

enter image description here

Si digo:

MyTabWidget -> setStyleSheet ("QTabWidget::pane { " 
    " margin: 0px,0px,0px,0px;" 
    " border: 1px solid darkgray;" 
    "}") ; 

entonces estoy casi de vuelta donde comencé:

enter image description here

Si intento de remediar esto con:

ApplicationTabWidget -> setStyleSheet ("QTabWidget::pane { " 
" margin: 0px,0px,0px,0px;" 
" border: 1px solid darkgray;" 
" border-top: 0px;" 
     "}") ; 

, de nuevo estoy burlado de mis dolores:

enter image description here

Actualización 2 Si olvido setStyleSheet y a su vez sólo documentMode en , esto es lo que obtengo:

enter image description here

Por favor, alguien dime que estoy siendo estúpido, y que hay una solución perfectamente simple para todo esto.

Respuesta

2

usted dijo "el contenido del cambio QScrollArea según la ficha seleccionada" bien si asumo que esto no es cierto, y lo que quiere decir es que el contenido del widget que está dentro de los cambios en el área de desplazamiento, entonces puede intentar esto:

Haga tantos objetos QScrollArea como pestañas necesite en su QTabWidget, pero solo uno, por ejemplo QTextEdit, que mostrará en cada área de desplazamiento, y qué contenido cambiará en el cambio de pestaña (takeWidget () de la pestaña anterior QScrollArea & setWidget() en la pestaña nueva QScrollArea)

No sé cómo ha diseñado su código, pero para intentar mi sugerencia su código s Debería diseñarse alrededor del widget dentro de QScrollArea, en lugar de QScrollArea.

+0

¡Esto parece prometedor! No puedo hacerlo exactamente de esta manera, porque he subclasificado QScrollArea (por lo que los contenidos realmente cambian). Pero intentaré crear cada pestaña con un widget ficticio y mover el QScrollArea subcategoría al widget ficticio de la pestaña actual. – TonyK

+0

Implementé su sugerencia, y definitivamente es una mejora. ¡Pero todavía no está bien! He actualizado mi pregunta con muchas capturas de pantalla. – TonyK

+0

@TonyK: ha intentado convertir el documentMode de QTabWidget en – zkunov

2

A menos que me entienda mal, si se apaga la frontera QScrollArea 's estableciendo el frameShape a NoFrame, el widget pestaña todavía tiene sus líneas de trama en los laterales y la parte inferior donde desee.

+0

Sí, si es un QTabWidget. Pero no si es un QTabBar. No puedo usar QTabWidget, porque solo tengo un widget para mostrar. – TonyK

0

me han tratado otro enfoque: Uso QTabBar, como en la primera pantalla, y luego cambiar el estilo de MyScrollArea (obvio, en retrospectiva):

MyScrollArea -> setStyleSheet ("QScrollArea {" 
    "border: 1px solid #898C95;" 
    "border-top: 0px;" 
    " }") ; 

Este es el resultado:

enter image description here

¡Casi a la derecha! Hay tres problemas:
- al pequeño cuadrado en la intersección de las dos barras de desplazamiento le falta su borde inferior (pero se dibuja si hago clic en las barras de desplazamiento, o cambio el tamaño de la ventana, o la ventana principal pierde el foco);
- la colur #898C95 está codificada, por lo que no será correcto si el usuario cambia el estilo. Pero si dejo fuera el estilo border, entonces todo el borde está pintado de blanco. ¿Hay alguna manera de consultar el color del borde actual de un estilo?
- lo que es más grave, el color de fondo del widget de punto de interrupción en el lado izquierdo ya no es blanco.

¡Pero creo que he perdido el tiempo suficiente en esto! Me quedaré con esta solución a menos que alguien pueda sugerir algo más para probar.