У меня есть всевозможные проблемы с размером с Qt. Я создание моих собственных виджетов и использование различных макетов (обычно мне нужен собственный, чтобы они работали должным образом, не тратя часы на «мощные» макеты по умолчанию ... которые не размещают вещи так, как задумано.)
Однажды я ' m сделано с виджетом и его макетом, но он работает неправильно. Размер никогда не устанавливается должным образом, если я не вызываю widget-> resize (1, 1);
, который, наконец, заставляет «изменить размер» и заставляет виджет выглядеть правильно (т.е. пересчитывать геометрию.) Даже вызов updateGeometry ()
не имеет никакого эффекта.
Это ужасная проблема, когда resize ()
необходимо вызываться для родительского виджета (фу!), и из того, что я читаю, не должно быть необходимости, если макеты правильно запрограммированы.
Есть ли образец, который работает и я Это не несколько тысяч строк, или Qt требуется несколько тысяч строк, чтобы что-то работало идеально, даже самый простой виджет?
Какие минимальные функции нужно вызывать, чтобы виджет и его макет работали одновременно?
]Спасибо. Алексис
П.С. Я пытался реализовать sizeHint ()
, minimumSize ()
, maximumSize ()
, другие, которые мне не хватает? Я надеялся, что этого будет достаточно. Очевидно, я также реализую setGeometry ()
в макете, чтобы соответствующим образом изменить размер дочерних элементов.
--- добавление 1
Существует образец изображения с макетом, который явно недоступен как находится в Qt. Расположение, функции и цвета различных клавиш определяются XML и работают с любой клавиатурой в мире.
(обратите внимание, что в этом примере клавиша Enter не отображается в двух строках и шире внизу, чем наверху; более или менее, вообще не работает с обычными макетами; конечно, это работает с моей версией.)
--- пояснение
Я не слишком уверен, как лучше описать проблему. Я думал написать тестовый виджет рядом, чтобы посмотреть, как я могу воспроизвести проблему, а затем опубликовать его и в конечном итоге исправить. 8 -)
Функция компоновки по умолчанию, которую используют внутренние компоновки Qt, требует большого количества кода. Я бы не хотел копировать / вставлять все это, потому что для обслуживания это делает это практически невозможным.
--- сегодняшние результаты
Поскольку мне нужно было настроить один из виджетов, я решил добавить VBoxLayout
и заставить его работать.
Я действительно нашел проблему ... Один из виджетов в моем дереве - это QScrollArea
и этот sizeHint ()
возвращает (-1, -1). Не совсем то, что я ожидал, но ... все, что вы вставляете в этот виджет, лучше знает, как вычислить его ширину и высоту, иначе ... он потерпит неудачу.
Присмотревшись к коду, я действительно мог вычислить ширину используя самую широкую найденную ширину. Как только я использую это, виджет появится (и он фактически изменит свой размер по мере того, как что-то меняется в списке, что-то круто).
При этом, как уже было сказано, мой предыдущий комментарий о наличии дерева виджетов, которые автоматически изменяют размер, остается в силе. От корня до родителей листьев в вашем дереве всем этим виджетам потребуется действующий макет.Как только я добавил один в верхний виджет, он изменил размер самого себя и своих дочерних элементов должным образом (ну ... в моем случае до QScrollArea
, остальные потребовали изменения размера снизу вверх. Забавно, как это работает!)
--- ах! ха! момент (или: то, что вы найдете при чтении кода реализации!)
Сегодня я столкнулся с другой проблемой, для которой требовался только правильный вызов ... Я просто не смог найти ничего стоящего в документации.
Все объекты теперь есть макет, но размер определенного родителя не изменится должным образом. Все просто.
Мне позвонили родителю и сказали:
// changes to the children are changing the geometry
parentWidget()->updateGeometry();
Да. Документы говорят, что это то, что вам нужно сделать. С этим звонком вообще ничего не происходит. Не знаю, что он должен делать, я не смотрел на эту функцию. В любом случае это для меня ничего не помогло.
Итак ... Я посмотрел на макет, чтобы попытаться понять, как он будет отправлять информацию вверх / вниз. Я мало что видел, кроме одного интересного комментария:
// will trigger resize
Это касается режима SetFixedSize
. Чтобы достичь этой функции, вам нужно сделать макет для обновления. Ах! Да ... макет, а не родительский виджет ... давайте попробуем вместо этого:
parentWidget()->layout()->update();
И вуаля! Он правильно меняет размер во всех случаях, которые у меня есть. Довольно невероятно, что виджет updateGeometry ()
не вызывает такого же эффекта ...