Это тот, на который я только что разработал ответ !!! (Примечание: это будет дано в форме PyQt4)
Мне нужна была возможность изменить размер окна моего приложения при отображении и скрытии дополнительных панелей.
Однако в прошлом я просто переконфигурировал пользовательский интерфейс и / или рабочий процесс, чтобы изменение размера окна не было необходимым. Однако теперь это необходимо.
Окно может быть изменено в размерах при создании. Размер окна может быть изменен напрямую (например, self.resize (xSize, ySize)
Однако, если вы создаете несколько строк кода, которые захватывают необходимые размеры, скрывают нужный раздел, пересчитывают, каким должен быть размер, изменение размера, по-видимому, вообще не требуется.
(пример)
curHgt = self.size().height()
curWth = self.size().width()
myFrmHgt = self.ui.reviewFrm.size().height()
self.ui.reviewFrm.hide()
self.resize( curWth, (curHgt - myFrmHgt ) )
Ничего. Не работает Почему нет?
Сегодняшняя охота за ответом все еще не принесла жизнеспособного ответа. Есть несколько предложений для вариантов. Выследить иерархию виджетов, сделать недействительными, настроить размер. Довольно исчерпывающее колебание компоновки, которое просто не будет работать, если вы пытаетесь изменить размер главного окна. Был также ошеломляющий ответ, сказав, чтобы установить ограничение на FixedSize. Но это скорее побеждает всю цель, вроде как сказать, чтобы отрезать руку на запястье, если у вас есть гвоздь.
Однако я наткнулся на кого-то, кто имел некоторый успех в копании и обнаружении, что причина, по которой изменение размера не вступает в силу, из-за очереди Отправленных Событий, которая сбросит изменение размера.
Его решением было запустить QApplication.sendPostedEvents () непосредственно перед изменением размера приложения, чтобы события в очереди не сбрасывали ваше окно.
И да и нет.
Да, это решение, и я уверен, что есть более красивый способ сделать это, но сначала вам нужно по-настоящему встряхнуть очередь, как вымытый валик.
Вот мой простой фрагмент, который я настроил, и который пока мне кажется надежным.
result = [ self.size().width(), self.size().height() ]
if self.ui.reviewFrm.isVisible():
result[1] -= self.ui.reviewFrm.size().height()
self.ui.reviewFrm.hide()
while self.size().height() > result[1]:
self.appy.sendPostedEvents()
self.resize( result[0], result[1] )
Неа. Это не красиво. Однако самое большее, что я видел, это только дважды тряхнул валик, прежде чем опубликованные события позволили изменить размер окна.
Нет необходимости блокировать ограничения, встряхивать родительские виджеты или лазить по иерархии в поисках подсказок по размеру.