Что заставляет виджет Qt и его макет вести себя должным образом (в отношении его размера)?

У меня есть всевозможные проблемы с размером с Qt. Я создание моих собственных виджетов и использование различных макетов (обычно мне нужен собственный, чтобы они работали должным образом, не тратя часы на «мощные» макеты по умолчанию ... которые не размещают вещи так, как задумано.)

Однажды я ' m сделано с виджетом и его макетом, но он работает неправильно. Размер никогда не устанавливается должным образом, если я не вызываю widget-> resize (1, 1); , который, наконец, заставляет «изменить размер» и заставляет виджет выглядеть правильно (т.е. пересчитывать геометрию.) Даже вызов updateGeometry () не имеет никакого эффекта.

Это ужасная проблема, когда resize () необходимо вызываться для родительского виджета (фу!), и из того, что я читаю, не должно быть необходимости, если макеты правильно запрограммированы.

Есть ли образец, который работает и я Это не несколько тысяч строк, или Qt требуется несколько тысяч строк, чтобы что-то работало идеально, даже самый простой виджет?

Какие минимальные функции нужно вызывать, чтобы виджет и его макет работали одновременно?

]Спасибо. Алексис

П.С. Я пытался реализовать sizeHint () , minimumSize () , maximumSize () , другие, которые мне не хватает? Я надеялся, что этого будет достаточно. Очевидно, я также реализую setGeometry () в макете, чтобы соответствующим образом изменить размер дочерних элементов.

--- добавление 1

Существует образец изображения с макетом, который явно недоступен как находится в Qt. Расположение, функции и цвета различных клавиш определяются XML и работают с любой клавиатурой в мире.

On screen keyboard

(обратите внимание, что в этом примере клавиша 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 () не вызывает такого же эффекта ...

5
задан Alexis Wilke 15 March 2017 в 19:23
поделиться