QSplitter se tornando indistinguível entre QWidget e QTabWidget
-
23-09-2019 - |
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.
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! :)