2015-01-20 2 views
4

У меня неприятная проблема. Я создал QVBoxLayout, на котором я добавил свои виджеты. Это пример из моего конструктора:Qt удалите пустое место между widgets на QVBoxLayout

layout = new QVBoxLayout; 
layout->setMargin(0); 
layout->setContentsMargins(QMargins(0,0,0,0)); 
layout->setSpacing(0); 

И тогда я функция для добавления виджетов.

layout->addWidget(_wave); 

_wave - мой собственный виджет. Но вы можете добавить все, что хотите, например, QButton.

Чего я хочу достичь? Similar like this, но без каких-либо пробелов между виджетами, добавленными в макет. Только только QButtons или другой виджет, склеивают друг друга.

Я добавил везде setMargins, setSpacing и т. Д. Пожалуйста, помогите мне в этом, у меня действительно нет идеи, что мне делать.

enter image description here

К сожалению для цветов, но я хотел бы упомянул, что я хочу достичь. У меня есть mainWindow, на котором я добавил QWidget. Этот виджет имеет синий фон. Затем в макет, я добавляю некоторые виджеты, которые на этом изображении оранжевые. Я просто хочу быть уверенным, что этот синий фон между виджетами не виден. Я хочу иметь виджет под виджетами, без какого-либо пространства.

ответ

1

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

  • "QFrame.setFrameShape()" в "NoFrame"
  • "QFrame.seLineWidth()" в 0.

Изображение, приведенное ниже, является результатом 2 «QtextEdit», размещенных бок о бок в макете, используя описанный метод.

enter image description here

http://doc.qt.io/qt-5/qframe.html#lineWidth-prop

+0

Я проверил его, он работает. Мне жаль, что у меня это было раньше (: Спасибо! – Tatarinho

2

Попробуйте это, чтобы добиться «плотного» вида. Обратите внимание: если вы измените размер родительского виджета, они не будут перемещаться. Не уверен, если это то, что вы хотите или нет, но ...

// After all widgets are added to the layout 
layout->insertStretch(-1, 1); 

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

+0

не совсем ... Я читал, что (-1,1) добавить растяжку в конце, и 1 толщина этого участка. Мне это действительно не помогло,/я изменился на (-1,0), чтобы быть уверенным, что это не толщина, но он действительно не двигался. Есть еще идеи? Его убивают меня – Tatarinho

+0

Можете ли вы показать скриншот того, что у вас есть, и того, что вы хотите? Второй аргумент в приведенном выше примере является коэффициентом растяжения, который является относительным. Если вы вызываете QLayout :: addWidget (QWidget *), коэффициент растяжения этого виджета равен 0. Вызов QLayout :: insertStretch (-1, 1) означает, что конец макета имеет самый высокий коэффициент растяжения, и только он будет растягиваться , –

+0

Когда вы вызываете setSpacing (0)? Я вызвал его на QGridLayout, и мои виджеты были уложены друг рядом друг с другом. –

1

Интервал Никогда Нет?

Как отмечается в документе Qt, некоторый виджет GUI по умолчанию имеет дополнительный кадр вокруг него.

Возьмите QPushButton как пример:

В некоторых стилях GUI кнопка по умолчанию обращается с дополнительной рамой вокруг него, до 3 пикселей или более. Qt автоматически сохраняет это пространство без кнопок «авто-по умолчанию», то есть кнопки с автоматическим дефолтом могут иметь подсказку с чуть большим размером .

Таким образом, виновник - это не макет, а сам виджет. «Невидимые» запас виджет по умолчанию остается, даже если расстояние макете установлено в 0.

Soultion

Если вам действительно нужен «компактного» макет, мое предложение прибегнуть к stylesheet виджетов.


Примеры

Ниже приведены примеры, чтобы проиллюстрировать идею:

Здесь мы имеем вертикальную компоновку как с отрывом и интервал равен 0, и кнопки с пользовательской таблицей стилей:

QPushButton { 
    border: 2px solid #8f8f91; 
    border-radius: 6px; 
    background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, 
             stop: 0 #f6f7fa, stop: 1 #dadbde); 
    min-width: 80px; 
} 

// (further stylesheet for button click is needed) 

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

enter image description here

Вставьте по умолчанию QPushButton, чтобы увидеть разницу:

enter image description here

Вы можете видеть, что пространство вокруг по умолчанию QPushButton. То же самое для других видов виджетов.

0

Я мог ошибаться, но, похоже, нет очевидного и не-взлома способа сделать то, что вы желаете. Однако, согласно документации, вы можете обнаружить, что просто выполнение макета вручную решит вашу проблему. (http://doc.qt.io/qt-5/layout.html: Manual Layout)

Кажется, что можно реализовать класс Layout, который фактически обеспечивает очень компактную горизонтальную или вертикальную компоновку, и я считаю, что написал несколько лет назад, используя Python и Qt. Имея это в виду, вы должны иметь возможность реализовать свой собственный MyCompactLayout(horizontal=True) и использовать его.

Смежные вопросы