Pregunta

Estoy Poner un elemento QWidget y una QTabWidget uno junto al otro en un divisor de horisontal. Y el divisor pierde su forma, se puede saber que hay un divisor solamente colocando el cursor del ratón sobre él. Cómo hacerlo visible?

Gracias.

¿Fue útil?

Solución

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 la misma. 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 añade una línea hundida en el mango divisor. Puede, por supuesto, elegir otro estilo para el uso line marco o algo completamente distinto, en el widget que agrega al mango divisor.

Otros consejos

I basado esto en el código anterior pero maneja ambas orientaciones divisor. Acabo de cambiar el tamaño preferido no opaca y los niños no plegables. El agarre se compone de tres líneas paralelas. Se puede jugar con el ancho de mango, pero el control a los 7 buena apariencia en Windows; No he comprobado 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();
    }
}

Esto es cierto para cada divisor al menos con WinXP y el Thema Luna predeterminado (cambiando a resuelve clásicos del problema). Si desea quedarse con Luna puede cambiar la forma de los divisores se representan, por ejemplo, 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();
}

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

Puede subclase QSplitter y anularlo de protected virtual QSplitterHandle * QSplitter::createHandle() de regreso todo lo que te hace feliz.

Por ejemplo, a partir de ese método sobrecargado puede volver subclase de QSplitterHandle con dibujo personalizado.

Gracias a la respuesta de Merula ... He intentado esto y ahora mis divisores son visibles y se veía muy bien sin mirar molesta. 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! :)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top