QSplitter становится неотличимым между QWidget и QTabWidget
Я помещаю QWidget и QTabWidget рядом друг с другом в один горизонтальный сплиттер. И сплиттер теряет форму, вы можете знать, что есть сплиттер только путем наведения мыши на него. Как сделать видимым?
Спасибо.
Ответы
Ответ 1
Так как QSplitterHandle (что большинство людей думает как "сплиттер" ) происходит от QWidget, вы можете добавить к нему другие виджеты. Вот что я сделал для решения этой конкретной проблемы в прошлом:
// 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);
Это добавляет затонутую линию в дескриптор сплиттера. Вы можете, конечно, выбрать другой стиль для фрейма line
или использовать что-то совершенно другое, как виджет, добавляемый в дескриптор разделителя.
Ответ 2
Я основывал это на вышеуказанном коде, но он обрабатывает обе ориентации сплиттера.
Я просто предпочитал непрозрачные изменения размера и не складывающиеся дети.
Ручка состоит из трех параллельных линий. Вы можете играть с шириной ручки, но хвататься за 7 выглядит хорошо на Windows; не проверены в Linux или 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();
}
}
Ответ 3
Это верно для каждого сплиттера, по крайней мере, с помощью WinXP и по умолчанию Luna thema (переход на классический решает проблему).
Если вы хотите остаться с Luna, вы можете изменить способ рендеринга сплиттеров. путем изменения цвета фона ручки.
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
a.setStyleSheet("QSplitter::handle { background-color: gray }");
MainWindow w;
w.show();
return a.exec();
}
Вы можете найти больше в таблицах стилей Qt по адресу https://doc.qt.io/qt-5/stylesheet-reference.html
Ответ 4
Вы можете подклассифицировать QSplitter и переопределить его protected virtual QSplitterHandle * QSplitter::createHandle()
, чтобы вернуть все, что вас радует.
Например, из этого перегруженного метода вы можете вернуть подкласс QSplitterHandle
с помощью пользовательского чертежа.
Ответ 5
Спасибо Merula ответ... Я пробовал это, и теперь мои разветкители видны и выглядят очень красиво, не выглядя навязчивыми. Этот код предназначен для Python с использованием PyQt или PySide.
app = QtGui.QApplication(sys.argv)
app.setStyle("Plastique") # set style (using this style shows splitters! :)