Название: Виджет, фиксирующий свои размеры внутри QTabWidget Отправлено: Serg от Октябрь 11, 2011, 17:03 Добрый день.
Есть у меня виджет TestPushButton (наследник QPushButton), который помещен на QTabWidget, находящийся внутри QDockWidget. При изменении размеров QDockWidget изменяется размер QTabWidget и TestPushButton. Нужно сделать так, чтобы при нажатии на TestPushButton фиксировались минимальные размеры TestPushButton (минимальным размерам присвоить размер TestPushButton во время ее нажатия) и не могли уменьшиться при ресайзе док виджета. В табвиджете закладки расположены справа. По отпусканию мыши для TestPushButton вызывается setMinimumSize(width(),height()). После вызова этой команды TestPushButton увеличивается (!). После десятка нажатий размеры значительно увеличатся. Какие размеры нужно послать в setMinimumSize, чтобы TestPushButton не увеличивался? Код: #include <QApplication> Название: Re: Виджет, фиксирующий свои размеры внутри QTabWidget Отправлено: kambala от Октябрь 11, 2011, 17:46 в Mac OS X кнопка не увеличивается после нажатия
Название: Re: Виджет, фиксирующий свои размеры внутри QTabWidget Отправлено: Serg от Октябрь 11, 2011, 18:45 К сожалению, у меня XP. А Мак даже в списке стилей недоступен.
Название: Re: Виджет, фиксирующий свои размеры внутри QTabWidget Отправлено: AnubiSAD от Октябрь 12, 2011, 07:50 А sizePolicy для pushButtona не работает что-ли?
Название: Re: Виджет, фиксирующий свои размеры внутри QTabWidget Отправлено: Serg от Октябрь 12, 2011, 12:30 В этом коде вся проблема именно в табвиджете. Если кнопку разместить внутрь вкладки табвиджета и задать ей минимальные размеры по текущим размерам, то она растянется в сторону таббара. Табвиджет использует для отображения виджетов внутри вкладок не их минимальные размеры, а немного больше места (на сколько больше - зависит от стиля).
Я придумал альтернативу. Может кому понадобиться... Или может кто-то предложит что-то нормальное... Я размещаю внутри доквиджета стеквиджет поверх табвиджета. В стеквиджет добавляю тестпушбуттон. Если в табвиджет будут добавлены вкладки, то их содержимое нужно добавлять в стеквиджет. Вот код: Код: int main(int argc,char**argv){ ... Конечно смешно использовать стеквиджет для отображения содержимого табвиджета. Но что еще можно сделать, если табвиджет самовольно и бесконтрольно изменяет размеры виджетов, содержащихся во вкладках? Может кто знает, какие реально размеры нужно вставить в сетминимумсайз, чтобы все работало внутри табвиджета??? Или какой минимумсайз использует табвиджет??? Тогда можно было б обойтись без стеквиджета. Название: Re: Виджет, фиксирующий свои размеры внутри QTabWidget Отправлено: Bepec от Октябрь 12, 2011, 12:45 sizePolicy изучай.
Просто установи своему наследнику кнопки sizePolicy - preferred, preferred. и она всегда будет минимизироваться по указанным размерам. Цитировать По отпусканию мыши для TestPushButton вызывается setMinimumSize(width(),height()). После вызова этой команды TestPushButton увеличивается (!). После десятка нажатий размеры значительно увеличатся. Какие размеры нужно послать в setMinimumSize, чтобы TestPushButton не увеличивался? А что тебя не устраивает? минимальные же размеры не поменялись при этом. Или ты хочешь чтобы кнопка "застывала" в том положении, в котором нажата была и не растягивалась? Название: Re: Виджет, фиксирующий свои размеры внутри QTabWidget Отправлено: AnubiSAD от Октябрь 12, 2011, 13:32 Может я, конечно, чего-то не догоняю, но что будет если выставить для pushButtona флаг QSizePolicy::fixed?
Я так понял, что надо, чтобы кнопка не меняла своих размеров? Вроде самое-то! И не надо размерами управлять, они просто не будут подстраиваться под изменение окна с такой политикой. Название: Re: Виджет, фиксирующий свои размеры внутри QTabWidget Отправлено: Bepec от Октябрь 12, 2011, 13:33 Ждем ответа TC. он мб объяснит что он хочет добиться своими действиями.
Название: Re: Виджет, фиксирующий свои размеры внутри QTabWid Отправлено: Serg от Октябрь 12, 2011, 22:57 Цитировать Или ты хочешь чтобы кнопка "застывала" в том положении, в котором нажата была и не растягивалась? Да!!! Да!!! Именно этого я и хочу!!!Цитировать Я так понял, что надо, чтобы кнопка не меняла своих размеров? Вроде самое-то! Кнопка должна менять свои размеры (с помощью пользователя)!!! Но она не должна уменьшаться до размеров меньших, чем была во время нажатия!!!Цитировать И не надо размерами управлять, они просто не будут подстраиваться под изменение окна с такой политикой. Меня интересует именно самостоятельное управление размерами!!! (А конкретно минимальным размером кнопки!!!). Вместо кнопки будет стоять полноценный самодельный виджет который не должен уменьшаться меньше определенных размеров. Эти минимальные размеры будут зависить от действий пользователя, проводимых над виджетом. В то же время самодельный виджет не должен самостоятельно увеличиваться ...А пока я даже с кнопкой не могу нормально справиться.Если тестпушбуттон поместить непосредственно на доквиджет, то он отлично фиксирует свои минимальные размеры. А вот подложка с табвиджета почему-то создает проблемы. Название: Re: Виджет, фиксирующий свои размеры внутри QTabWidget Отправлено: Bepec от Октябрь 13, 2011, 07:55 Начну отвечать по порядку
1) PS setMinimumSize(width(),height()) - если я правильно понимаю, ты кнопке присваиваешь ширину и высоту ВСЕГО виджета главного окна. - ты проверил? 2) попробуй сделать костыль - запоминать состояние кнопки после нажатия и восстанавливать его минимальные размеры. 3) скинь архив с проектом - и тогда уж тебе проблему решим(не за секунду, но минут за 10 я думаю) PS на QTabWidget у меня все виджеты ложаться с политикой не растягиваться. Но это уже смотреть надо в проекте. PPS выложи проект минимальный. Название: Re: Виджет, фиксирующий свои размеры внутри QTabWidget Отправлено: Serg от Октябрь 13, 2011, 09:22 Цитировать 2) попробуй сделать костыль - запоминать состояние кнопки после нажатия и восстанавливать его минимальные размеры. Вот файл .спп (вложенный). В нем есть куча дебагов (их даже больше чем кода). Это такой себе "проект минимальный", так как в полном проекте этого кода еще нет.Цитировать 1) PS setMinimumSize(width(),height()) - если я правильно понимаю, ты кнопке присваиваешь ширину и высоту ВСЕГО виджета главного окна. - ты проверил? Проверил - смотри дебаг спп-файла. width() и height() - размеры кнопки (какие тут сомнения?).Цитировать на QTabWidget у меня все виджеты ложаться с политикой не растягиваться Мне нужен не стандарт.... Интересный момент!!! Я раньше не интересовался, кто будет парентом для объекта внутри вкладки табвиджета. Оказывается, им будет QStackedWidget (смотри дебаг .спп). Я над этим стекэдвиджетом еще поэксперементирую... Название: Re: Виджет, фиксирующий свои размеры внутри QTabWidget Отправлено: Bepec от Октябрь 13, 2011, 09:52 Выглядит жутко :) скачал пробую
Название: Re: Виджет, фиксирующий свои размеры внутри QTabWid Отправлено: AnubiSAD от Октябрь 13, 2011, 12:50 Кнопка должна менять свои размеры (с помощью пользователя)!!! Но она не должна уменьшаться до размеров меньших, чем была во время нажатия!!! Вот тут я совсем запутался! По смыслу фраза означает, что кнопка должна остаться в своих размерах, только написано как-то уж замудренно. Название: Re: Виджет, фиксирующий свои размеры внутри QTabWidget Отправлено: Bepec от Октябрь 13, 2011, 13:09 Интересный факт, что у кнопки, помещенной в QTabWidget/QStackWidget/QStackWidgetLayer исчезают поля, и если задавать ее значение как минимальное, то величина виджета/поля/кнопки увеличивается на 1 :)
копаю, но тут что то с компоновкой походу :) PS конечно в качестве рекламы - возможен костыль на убиение 3-5 пикселей, причем без побочных эффектов - минимальный размер будет уже зафиксирован в тот момент. To GreatSnake если зайдет Интересен факт, что при установке минимального значения для кнопки, автоматом вызывается минимальный размер для QStackWidgetLayer(скажем так подозрение на него), и соответственно он не учитывает своих же полей и делает кря на +1 - +3 пикселя. Название: Re: Виджет, фиксирующий свои размеры внутри QTabWidget Отправлено: GreatSnake от Октябрь 13, 2011, 13:35 2 Serg:
Вы можете объяснить для чего вообще всё это делается? Что нужно в итоге? Название: Re: Виджет, фиксирующий свои размеры внутри QTabWidget Отправлено: Serg от Октябрь 14, 2011, 00:52 В общем, из дебага, проведенного над "бутербродом" из доквиджета-табвиджета-стеквиджета-тестпушбуттона я сделал выводы, что во всем виноват табвиджет. Он возвращает неправильный minimumSizeHint().width(), если у него закладки расположены сбоку и неправельный minimumSizeHint().height(), если у него горизонтальное расположение закладок. От того и лейаут плавает.
Я унаследовался от табвиджета и переопределил ему процедуру minimumSizeHint(). Тот код, который содержится в переопределенной процедуре minimumSizeHint() был скопирован (и упрощен) из QTabWidget::minimumSizeHint(). Я удалил (для простоты) с него все части кода, которые не используются в моем табвиджете. Теперь на табвиджете можно размещать элементы, способные фиксировать свои размеры (такие как тестпушбуттон). Код с переопределенной minimumSizeHint() для доквиджета представлен в спп файле. Работоспособность кода была проверена на стилях "windows", "motif", "cde", "plastique" "cleanlooks" и "windowsxp". Спасибо за внимание. |