Проблемы с размером ячейки Qt QHboxLayout
Вопрос
Для тех из вас, кто не читал мои квесты по Qt: я изучаю Qt для проекта.У меня вообще ограниченный опыт проектирования графического интерфейса, а не Qt.
У меня есть горизонтальный макет, который я хочу заполнить несколькими кнопками.Я могу легко вставить эти кнопки, но мои бывшие квадратные кнопки растягиваются по горизонтали и занимают больше места.
Я хочу, чтобы менеджер по расположению мог определить лучший способ изменения размера этих кнопок, но я также хочу, чтобы их исходные пропорции оставались неизменными.Например, если я начну с кнопок 32X32, которые необходимо сжать, чтобы они поместились в макете, я хочу, чтобы они сжимались пропорционально, чтобы сохранить масштаб ширины и высоты.20X20, 16X16, 12X12 — все бы ничего, но 24X16 — это пример неприемлемых размеров.
Я поработал с правилами размера кнопок и опциями растягивания.Я не вижу, даже после прочтения классов QPushButton и QHboxLayout, как это сделать.Как это достигается?
Спасибо.
Решение
Если я правильно понимаю вопрос, я думаю, что вы хотите QBoxLayout::addStretch()
.Это добавит объект-разделитель, который заполнит неиспользуемое пространство.Таким образом, кнопки будут иметь идеальный размер, а проставка заполнит все остальное.Вы можете попробовать поэкспериментировать с этим в Designer, это проще, чем цикл записи/компиляции/выполнения.
Другие советы
Вам стоит посмотреть ответы на этот вопрос.Это резюме моего ответа.
Вам необходимо создать собственную производную от QLayoutItem, которая переопределяет bool hasHeightForWidth()
и int heightForWidth( int width )
чтобы сохранить соотношение сторон.Вы можете либо передать кнопку и запросить ее, либо просто установить соотношение напрямую.Вам также необходимо убедиться, что функция widget() возвращает указатель на нужную кнопку.
Как только это будет сделано, вы сможете добавить элемент макета в макет так же, как и виджет.Поэтому, когда ваша кнопка будет добавлена, измените ее, чтобы использовать свой собственный класс элемента макета.
На самом деле я ничего из этого не проверял, так что на данный момент это теоретическое решение.Я не знаю, как реализовать это решение через дизайнера, если бы это было желательно.