Название: Как принудительно пересчитать sizeHint Отправлено: Sasha от Января 20, 2016, 17:30 Здравствуйте,
Есть форма у которой несколько вложенных фреймов и где-то внутри есть QLabel у которого wordWrap=true. Далее в конструкторе после ui->setupUi(this); я пытаюсь посчитать размер всей формы в 2-х вариантах - когда wordWrap=true и wordWrap=false. Делаю я это кодом: Код Но оказывается, что sz1 = sz2. что нужно вставить перед 2-м sizeHint-ом, чтобы sz2 получился неравным sz1? Я пробовал: Код Ничего не помогло. Дабы убедиться, что они всё-же разные и зависят от wordWrap, я закоментарил получение sz1, т.е. посчитал только sz2 после сброса wordWrap-а и он оказался другим. Название: Re: Как принудительно пересчитать sizeHint Отправлено: kambala от Января 20, 2016, 17:57 попробуй
Код
Название: Re: Как принудительно пересчитать sizeHint Отправлено: Sasha от Января 20, 2016, 18:24 Не помогло
Кстати, если зайти внутрь adjustSize-а, то там почти сразу вызывается sizeHint(), который как раз и нужен. Перед ним только ensurePolished(), но видимо он тоже не инвалидэйтит всё. Название: Re: Как принудительно пересчитать sizeHint Отправлено: Igors от Января 21, 2016, 04:02 Да, мутное место, тоже неск раз сталкивался но не нашел четкого решения, каждый раз "методом втыка". Попробуйте
Код Но layout должен быть именно тем где сидит QLabel. Не поможет - выкладывайте тестовый проект (в zip) Название: Re: Как принудительно пересчитать sizeHint Отправлено: Sasha от Января 21, 2016, 12:17 Если я Вас правильно понял, то если иерархия такая:
frame -> frame2 --->label то нужно вызывать frame2->layout()->activate(); Если так, то я так сделал и тоже не помогло. Собственно, я попробовал и для frame и тоже не помогло. Чуть попозже попробую сделать маленький пример и выложить. Название: Re: Как принудительно пересчитать sizeHint Отправлено: Sasha от Января 21, 2016, 13:47 Создал я тестовый проект под VisualStudio2010 - он в прикреплённом файле. Там в файле sizehint.cpp в конструкторе sizeHint::sizeHint() sizeHint берётся 2 раза строчками QSize sz2 = ui.frame->sizeHint(); и QSize sz = ui.frame->sizeHint(); между которыми вначале производятся изменения wordWrap для QLabel-ов и далее разные попытки инвалидэйтить форму с целью добиться чтобы sz не равнялся sz2. Там же есть и рабочий вариант с ф-ей влоб инвалидэйтящую всё дерево - QLayout_invalidateTree().
Название: Re: Как принудительно пересчитать sizeHint Отправлено: Igors от Января 21, 2016, 16:26 Вроде так работает (Qt 5.4.2)
Код
Название: Re: Как принудительно пересчитать sizeHint Отправлено: Sasha от Января 21, 2016, 17:16 Да, работает, спасибо.
На всякий случай приведу здесь и своё решение, которое инвалидэйтит всю иерархию. Может кому-то понадобится Когда чётко известно, что поменялось и поменялось не много, то Ваше решение конечно будет оптимальнее. Код
|