QSplitter показывает разделитель или границу между двумя виджетами

У меня есть QSplitter и два виджета с каждой стороны, но я хочу иметь запас, чтобы был четкий переход между двумя виджетами. Я посмотрел в QSplitter и QSplitterHandle, но не вижу явного способа сделать это.

Как добавить разделитель между двумя виджетами?


person Nick    schedule 26.07.2011    source источник
comment
Вы пробовали стилизовать QSplitter с помощью таблицы стилей?   -  person Liz    schedule 26.07.2011
comment
нет..не знаю что это..   -  person Nick    schedule 26.07.2011
comment
stackoverflow.com/a/59951077/3096593   -  person francek    schedule 24.02.2020


Ответы (3)


Таблицы стилей — это мощный механизм изменения внешнего вида любого виджета в Qt.

Краткое руководство см. здесь и здесь для получения справочного руководства. Таблицы стилей можно назначать с помощью редактора в Designer или передавать в виде строки с помощью setStylesheet(QString). Конечно, использовать Designer проще, потому что тогда вы можете увидеть, как будет выглядеть ваш виджет, прежде чем запускать его.

Теперь о вашей конкретной проблеме. QSplitter по сути является QFrame. Но он также включает в себя ручку - как вы знаете. Так что обычно это то, что обычно стилизовано.

Так, например, вы можете сделать это:

QSplitter::handle {
         image: url(:/images/splitter.png);
     }

Который предоставляет изображение для дескриптора сплиттера. Это немного похоже на то, что делается в Motif, где всегда отображается небольшая прямоугольная ручка, по которой пользователь может щелкнуть, чтобы переместить разделитель.

Немного поэкспериментировав, вы можете создать классную линию разделения для ручки.

QSplitter::handle {
    background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, 
stop:0 rgba(255, 255, 255, 0), 
stop:0.407273 rgba(200, 200, 200, 255), 
stop:0.4825 rgba(101, 104, 113, 235), 
stop:0.6 rgba(255, 255, 255, 0));
    image: url(:/images/splitter.png);
     }

Или что-то более нарисованное, как этот.

QSplitter::handle:horizontal {
background: qlineargradient(x1:0, y1:0, x2:1, y2:1,
    stop:0 #eee, stop:1 #ccc);
border: 1px solid #777;
width: 13px;
margin-top: 2px;
margin-bottom: 2px;
border-radius: 4px;
}

Для этого последнего мы специально переопределяем только горизонтальный разделитель из-за некоторых свойств, таких как margin-top и bottom, и ширина, которая должна быть другой, если мы меняем вертикальный разделитель.

Надеюсь это поможет. Как только вы начинаете играть с таблицами стилей, начинается настоящее веселье.

person Liz    schedule 26.07.2011
comment
Спасибо, это помогло мне сегодня. Должен ли он реагировать на атрибут hover? Я бы хотел, чтобы он становился черным, когда пользователь наводит курсор, но QSplitter::handle:hover, похоже, не помогает. - person Phlucious; 01.05.2020

QSplitter имеет свойство handleWidth, которое вы можете установить.

person Arnold Spence    schedule 26.07.2011
comment
Что ничего не делает для того, чтобы на самом деле заставить что-то рисовать, это просто делает невидимую ручку шире. - person Michael Mrozek; 12.04.2017

Не вдаваясь во все кровавые подробности таблиц стилей, я могу дать вам пару вариантов:

1) Вы можете разместить пару QFrames в своем сплиттере, дать им макеты и поместить свои виджеты внутри этих фреймов. Вы можете использовать параметры интервалов макетов (см. QLayout::setContentsMargin()), чтобы добавить интервал вокруг ваших виджетов.

2) Способ таблицы стилей (и, на мой взгляд, лучший способ) заключается в настройке некоторых таблиц стилей для ваших виджетов. Для краткого примера вы можете сделать что-то подобное для своих виджетов, которые находятся в вашем сплиттере:

widget->setStyleSheet( "margin-left: 10px" )

Если вы занимаетесь каким-либо дизайном графического интерфейса с помощью Qt, я настоятельно рекомендую вам узнать все о таблицах стилей, они ваши друзья. См. справочник по таблицам стилей Qt для получения некоторой документации.

person Chris    schedule 26.07.2011