2013-03-01 2 views
2

Я пытаюсь скрыть QDoubleSpinBox в программе интерфейса Qt, используя C++.Скрытие элемента с помощью Qt

Я нашел функцию hide(), но она не работает так, как я ожидал, поскольку, когда я скрываю элемент, пространство, которое оно занимало, не учитывается, поэтому все мое окно становится сумасшедшим. Мне было интересно, есть ли какая-нибудь функция, чтобы скрыть и сохранить занятое пространство, например, если это нормально. Я думал, что, возможно, это будет функция, подобная этой, потому что она распространена в других рамках или даже JavaScript.

Если нет ... никаких решений?

+0

Посмотрите здесь, это сработало для меня: http://stackoverflow.com/a/10840906/131930 –

+0

в том же посте, что и у Джереми, есть хорошие альтернативы: http://stackoverflow.com/a/10819251/1122645 – UmNyobe

+0

Это действительно необходимо, чтобы скрыть элемент? Это будет довольно запутанным для пользователя, и вы можете отключить свои виджеты - это должно обеспечить четкое заявление о том, что пользователь не может использовать этот элемент сейчас. –

ответ

3

Это из-за макетов. Макеты автоматически пересчитываются при добавлении/удалении или отображении/скрытии элементов. Вы можете просто отказаться от использования макетов.

+0

Да, я предположил, что макеты пересчитывают пространство, когда объект отсутствует, но ... нет ли какой-либо другой опции? – Frion3L

+0

Если виджет не находится в середине других виджетов, вы можете использовать вертикальные/горизонтальные прокладки, чтобы убедиться, что макет остается прежним. – sashoalm

+0

Это ответ на вопрос? – UmNyobe

2

Вы также можете попробовать установить непрозрачность 0.0 вместо того, чтобы скрывать QDoubleSpinBox.

mySpinBox.setWindowOpacity(0.0); 

На самом деле я не думаю, что это сработает.

Простейшая вещь, которую я могу придумать, - это подкласс QDoubleSpinBox, а затем переопределить функцию рисования (и, возможно, манипуляцию с мышью), которая будет включена и выключена с помощью вашей собственной переменной.

+0

Проблема заключается в том, что событие рисования отправляется объекту только при видимости объекта. – UmNyobe

+1

Правильно, но если вы контролируете, что делает событие рисования (и если оно получает вход) от вашего собственного входа, вы можете оставить объект видимым, и просто не отображать его. –

0

Довольно быстрое, но не изящное решение заключается в подклассе нужного виджета, добавлении дополнительного bool, чтобы сделать виджет невидимым, не удаляя его геометрию и метод для его переключения, а также в перегруженном событии рисования, если bool true, вызовите исходное событие рисования из базового класса, иначе ничего не рисуйте. Это приведет к полностью прозрачному виджету, который все равно примет события, поэтому вы также можете использовать setEnabled() с помощью bool, чтобы также отключить его, пока он скрыт.

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