QSplitter показывает разделитель или поле между двумя виджетами - PullRequest
7 голосов
/ 26 июля 2011

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

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

Ответы [ 3 ]

11 голосов
/ 26 июля 2011

Таблицы стилей - это мощный механизм изменения внешнего вида любого виджета в 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 и width, которые должны были бы отличаться, если бы мы меняли вертикальный разделитель.

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

1 голос
/ 26 июля 2011

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

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

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

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

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

1 голос
/ 26 июля 2011

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

...