Pergunta

Estou colocando um QWidget e um QTabWidget próximos um do outro em um divisor horizontal.E o divisor perde a forma, você pode saber que existe um divisor apenas passando o mouse sobre ele.Como torná-lo visível?

Obrigado.

Foi útil?

Solução

Como o QSplitterHandle (que é o que a maioria das pessoas pensa como o 'divisor') é derivado do Qwidget, você pode adicionar outros widgets a ele. Aqui está o que fiz para resolver esse problema exato no passado:

// 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);

Isso adiciona uma linha afundada à alça do divisor. Você pode, é claro, escolher outro estilo para o quadro line Ou use algo totalmente diferente como o widget que você adiciona à alça do divisor.

Outras dicas

Eu baseei isso no código acima, mas ele lida com as duas orientações do divisor. Eu apenas preferia crianças de redimensionamento não opeso e não colapsáveis. A aderência consiste em três linhas paralelas. Você pode brincar com a largura da alça, mas a aderência às 7 fica bem nas janelas; Não fiz check -in no Linux ou 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();
    }
}

Isso é verdade para todos os divisores, pelo menos com WinXP e o tema Luna padrão (mudar para o clássico resolve o problema).Se você quiser ficar com o Luna, você pode alterar a forma como os divisores são renderizados, por exemplo.alterando a cor de fundo da alça.

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

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

Você pode encontrar mais informações sobre folhas de estilo Qt em https://doc.qt.io/qt-5/stylesheet-reference.html

Você pode subclasse qsplitter e substituir é protected virtual QSplitterHandle * QSplitter::createHandle() para devolver qualquer coisa que te faça feliz.

Por exemplo, a partir desse método sobrecarregado, você pode retornar a subclasse de QSplitterHandle com desenho personalizado.

Graças à resposta de Merula ... eu tentei isso e agora meus divisores são visíveis e parecem muito bons sem parecer desagregados. Este código é para Python usando Pyqt ou Pyside.

app = QtGui.QApplication(sys.argv)
app.setStyle("Plastique")   # set style (using this style shows splitters! :)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top