2010-03-30 11 views

Respuesta

25

Desde el QSplitterHandle (que es lo que la mayoría de la gente considera como el 'splitter') se deriva de QWidget, puede añadir otros widgets a ella . Esto es lo que he hecho para resolver este problema exacto en el pasado:

// Now add the line to the splitter handle 
// Note: index 0 handle is always hidden, index 1 is between the two widgets 
QSplitterHandle *handle = pSplitter->handle(1); 
QVBoxLayout *layout = new QVBoxLayout(handle); 
layout->setSpacing(0); 
layout->setMargin(0); 

QFrame *line = new QFrame(handle); 
line->setFrameShape(QFrame::HLine); 
line->setFrameShadow(QFrame::Sunken); 
layout->addWidget(line); 

Esto agrega una línea hundida al asa del divisor. Por supuesto, puede elegir otro estilo para el cuadro line o usar algo completamente diferente como el widget que agrega al identificador del divisor.

+0

Muchas gracias :)! – Narek

+0

Esto es fantástico. Solo agregaría que prefiero un QHBoxLayout porque entonces puedo asignar un 'maximumWidth' (para divisores horizontales) a la línea horizontal. – Phlucious

+0

Upvoted porque funciona, pero realmente se siente como una solución torpe para un error de Qt ... –

7

Esto es cierto para cada divisor al menos con WinXP y el predeterminado Luna thema (cambiar a clásico resuelve el problema). Si desea permanecer con Luna, puede cambiar la forma en que se representan los separadores, p. cambiando el color de fondo del mango.

int main(int argc, char *argv[]) { 

    QApplication a(argc, argv); 
    a.setStyleSheet("QSplitter::handle { background-color: gray }"); 
    MainWindow w; 
    w.show(); 
    return a.exec(); 
} 

Usted puede encontrar más información sobre las hojas de estilo de Qt en https://doc.qt.io/qt-5/stylesheet-reference.html

+0

Gracias. Esto cambia de color, pero me gustaría cambiar el alivio del divisor. ¿Es eso posible? – Narek

+0

El comportamiento predeterminado del divisor en Windows es dibujar el color de fondo. Esto es malo cuando los componentes divididos también tienen color bg por defecto (QWidget). La forma de las ventanas es darles un color diferente y/o un borde hundido (QFrame admite bordes). Si desea utilizar el relieve, debe cambiar el estilo (olvide la hoja de estilos). Use setStyle() para cambiar el estilo. Los alivios son compatibles, por ej. por QPlastiqueStyle. Puede aplicar setStyle() al objeto QApplication o solo al splitter (no preferido). Propondría la solución nativa mencionada primero. – merula

+0

Puede sobrescribir QSplitter :: createHandle() para devolver el identificador con el dibujo personalizado –

8

Basé esto en el código anterior pero maneja ambas orientaciones del divisor. Acabo de preferir el cambio de tamaño no opaco y los niños no plegables. La empuñadura consta de tres líneas paralelas. Puede jugar con el ancho del mango, pero agarre a 7 se ve bien en Windows; no he verificado en Linux o Mac.

void helper::decorateSplitter(QSplitter* splitter, int index) 
{ 
    Q_ASSERT(splitter != NULL); 

    const int gripLength = 15; 
    const int gripWidth = 1; 
    const int grips = 3; 

    splitter->setOpaqueResize(false); 
    splitter->setChildrenCollapsible(false); 

    splitter->setHandleWidth(7); 
    QSplitterHandle* handle = splitter->handle(index); 
    Qt::Orientation orientation = splitter->orientation(); 
    QHBoxLayout* layout = new QHBoxLayout(handle); 
    layout->setSpacing(0); 
    layout->setMargin(0); 

    if (orientation == Qt::Horizontal) 
    { 
     for (int i=0;i<grips;++i) 
     { 
      QFrame* line = new QFrame(handle); 
      line->setMinimumSize(gripWidth, gripLength); 
      line->setMaximumSize(gripWidth, gripLength); 
      line->setFrameShape(QFrame::StyledPanel); 
      layout->addWidget(line); 
     } 
    } 
    else 
    { 
     //this will center the vertical grip 
     //add a horizontal spacer 
     layout->addStretch(); 
     //create the vertical grip 
     QVBoxLayout* vbox = new QVBoxLayout; 
     for (int i=0;i<grips;++i) 
     { 
      QFrame* line = new QFrame(handle); 
      line->setMinimumSize(gripLength, gripWidth); 
      line->setMaximumSize(gripLength, gripWidth); 
      line->setFrameShape(QFrame::StyledPanel); 
      vbox->addWidget(line); 
     } 
     layout->addLayout(vbox); 
     //add another horizontal spacer 
     layout->addStretch(); 
    } 
} 
+0

Probablemente la mejor solución aquí incluso usando Qt5.6. ¡Gracias! – Plouff

+0

Tuve que establecer 'gripWidth = 2' para que los apretones estuvieran visibles (aspecto clásico de Win7).De lo contrario, una buena solución para un problema que debería haberse solucionado en Qt años atrás. – DerManu

0

Usted puede subclase QSplitter y anular es protected virtual QSplitterHandle * QSplitter::createHandle() para devolver cualquier cosa que te hace feliz.

Por ejemplo, desde ese método sobrecargado puede devolver la subclase de QSplitterHandle con un dibujo personalizado.

-1

Gracias a la respuesta de Merula ... Intenté esto y ahora mis divisores son visibles y se ven muy bien, sin mirar molesto. Este código es para Python usando PyQt o PySide.

app = QtGui.QApplication(sys.argv) 
app.setStyle("Plastique") # set style (using this style shows splitters! :) 
+0

¿qué idioma es este? Esto no se ve como C++ –

+0

¡Uy! Lo siento, esto es python usando pyqt o pyside – panofish

Cuestiones relacionadas