Russian Qt Forum
Ноябрь 24, 2024, 05:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QGridLayout. Одинаковый размер виджетов в ячейках  (Прочитано 12717 раз)
z-word
Гость
« : Январь 18, 2011, 14:19 »

Добрый день!

Проблема такая: есть лейаут(QGridLayout) (см.картинку)

Изначально есть 2 кнопки и один чекбокс. При нажатии на кнопку "+" добавляется чекбокс, кнопочка "-" и кнопка "1".
Сейчас реализовано так, что кнопка "+" и "1" занимает два ряда в лейауте( addMultiCellWidget() ), а добавляемый чекбокс и кнопочка "-" по одному ( addWidget() ).

Так вот, хочется, чтобы эти чекбокс и кнопочка были одинакового размера.
Не пойму как это сделать. Потому что, если с размерами добавляемых виджетов ничего не делать, то кнопочка "-" будет уже не кнопочкой:), а кнопкой с размерами кнопки "+".

Эти чекбокс и кнопочка добавляются в обработчике кнопки "+".

Я думал, что надо сначала добавить чекбокс и посмотреть его размеры с помощью QGridLayout->cellGeometry(i, j).width() и height() и как-то сказать, чтобы размер ячейки в которую будет вставляться кнопочка "-" была того же размера, но  cellGeometry() выдаёт некорректные значения на данную ячейку, а корректные значения на эту ячейку выдаёт только когда ещё раз нажмёшь на "+", т.е. при следующем заходе в обработчик кнопки "+".

То, что вы видите на картинке это мои попытки как-то решить мою проблему, а именно:
при первом входе в обработчик кнопки "+" я с помощью cellGeometry() определяю размер первого чекбокса и с помощью setFixedWidth() устанавливаю размер кнопки "-" (что я думаю не правильно, так как размер получается фиксированный и лейаут, наверное, уже не будет сам подгонять его при добавлении новых виджетов, чтобы все было как надо:) ) При следующем входе в обработчик я тем же способом определяю размер второго чекбокса и провожу ту же операцию установки размера кнопки, но так как первый чекбокс был один (занимал один ряд - и лейуат выставил его размеры одним образом), а второй уже с кнопочкой "-" (т.е. уже два ряда и чекбокс получил другие размеры, так как под ним появился ряд с кнопочкой), то размеры третьей кнопочки уже получаются нормальными, что и видно на картинке. Но, мне кажется, все это не правильно из-за того, что я жестко устанавливаю размеры кнопки.

Записан
Fat-Zer
Гость
« Ответ #1 : Январь 18, 2011, 14:55 »

а если чекбокс и кнопку в отдельный лейаут пихнуть? я бы вообще каждый ряд  в свой лейаут пихнул бы...
Записан
z-word
Гость
« Ответ #2 : Январь 18, 2011, 15:17 »

Не совсем понял. Т.е. из чекбокса и кнопки сделать один лейуат и запихнуть его в ячейку основного лейаута?
мне кажется проблема размеров останется, нет?
А если каждый ряд в свой лейаут, то тогда ведь внешний вид поменяется?
Записан
dd
Гость
« Ответ #3 : Январь 18, 2011, 15:20 »

Почему изменится то? Правильно человек говорит, лайаутов сколько угодно можно.
Только там по умолчанию отступы будут лишние. Их можно поубирать, поставив 0.
Не совсем понял, что нужно получить, лучше измени скрин в paint - е, как нужно получить и как есть сейчас.
Подскажем код.
« Последнее редактирование: Январь 18, 2011, 15:23 от dd » Записан
z-word
Гость
« Ответ #4 : Январь 18, 2011, 15:31 »

Как есть сейчас - это в моём первом посте, а надо так как справа от кнопки "2", чтобы одинаковые по размерам чекбокс и кнопочка были.
(т.е. не так как справа от кнопки "1", видите там размер кнопочки "-" не "правильный")
« Последнее редактирование: Январь 18, 2011, 15:33 от z-word » Записан
Fat-Zer
Гость
« Ответ #5 : Январь 18, 2011, 15:36 »

пока вы не сказали, я эту разницу в 2 пикселя даже не замечал... тогда с размером по горизонтале проблемма должна решится... а по вертикале наверное придётся  костылями подпирать. НЕадо подумать...
Записан
dd
Гость
« Ответ #6 : Январь 18, 2011, 15:43 »

Ну я бы сделал так:
когда надо добавить очередную группу кнопок,
мекбоксу и маленькой кнопочке выставляешь setMinimumSize, как у чекбокса.
Далее создает QGridLayout, суем туда кнопки, лайоут добавляем в главный лайоут.
Все.
Записан
z-word
Гость
« Ответ #7 : Январь 19, 2011, 11:12 »

dd, а чем поможет setMinimumSize?
Это же для того, чтобы виджет нельзя было уменьшить меньше, чем размер переданный этой ф-ии.
Записан
dd
Гость
« Ответ #8 : Январь 19, 2011, 11:24 »

Layout не сможет сделать размер меньше размера чекбокса. В этом ведь суть топика?
Записан
z-word
Гость
« Ответ #9 : Январь 19, 2011, 11:46 »

Воспользуюсь советом:
Цитировать
лучше измени скрин в paint - е, как нужно получить и как есть сейчас.

это когда просто в лейаут пихаешь виджеты:


а надо:


т.е. чтобы группа из трёх виджетов на первом рисунке(кнопка "1", чекбос и кнопка "-") была (по размерам!!) как
кнопка "2" и два виджета справа от неё(чтобы чекбокс и кнопочка "-" были одинакового размера)
не обращайте внимания на кнопку "1" и два её правых виджета - это были мои попытки решить мою проблему(размеры чекбокса и кнопочки не одинаковые)

надеюсь, сейчас понятно объяснил суть проблемы)
Записан
dd
Гость
« Ответ #10 : Январь 19, 2011, 12:05 »

Сейчас напишу пример и выложу )
Записан
z-word
Гость
« Ответ #11 : Январь 19, 2011, 12:36 »

Цитировать
Сейчас напишу пример и выложу )

супер!! жду)
Записан
dd
Гость
« Ответ #12 : Январь 19, 2011, 13:13 »

Короче сделал, как ты хотел.
Но тебе придется отказаться от идеи сделать кнопку размером с чекбокс.
Причина тому - темы оболочки.
Судя по скринам, у тебя не стоит тема XP.
У меня линукс, там стоит. Если ты поставишь тему у себя, все поплывет тоже.
Дело в том, что чекбокс и кнопка, будучи одного размера, имеют на вид не один размер.
Причина тому - разные борта, которые задаются в теме.

Вот скрин

Решение на мой взгляд - как вариант не QPushButton делать с минусом, свой виджет сделать, наслдедованный от QWidget.

А вообще лучше перепридумать интерфейс. Будет все плыть на разных темах + неудобно искать маленькие кнопочки.
« Последнее редактирование: Январь 19, 2011, 13:51 от dd » Записан
z-word
Гость
« Ответ #13 : Январь 19, 2011, 14:43 »

Цитировать
Но тебе придется отказаться от идеи сделать кнопку размером с чекбокс.
в принципе, это не критично, чтобы размеры были одинаковые. Как у тебя на скрине тоже покатит.

У меня вопрос: как ты задавал размер кнопки "-"? Ты жестко задал размеры или как-то "подсказал" лейауту, чтобы она была размера близкого к размеру чекбокса? блин, не знаю как сформулировать правильно, надеюсь ты понял.

Цитировать
свой виджет сделать, наслдедованный от QWidget.
не хватает пока знаний

Записан
dd
Гость
« Ответ #14 : Январь 19, 2011, 14:55 »

У стандартный виджетов есть такая свойство (property), как sizeHint.
Это оптимальный размер. Он зависит от настроек системы. Он будет браться при размещении в лайоуте.
Допустим оптимальнаяы высота чекбокса у меня оказалась 17 пикселей.
Я беру это значение у чекбокса и задаю размер кнопки.

Код:
    QCheckBox *pCheckBox = new QCheckBox(this);
    QSize sz = pCheckBox->sizeHint();
    pLayout->addWidget(pCheckBox, 0, 1);

    QPushButton *pButtonMinus = new QPushButton("-", this);
    pButtonMinus->setMinimumHeight(sz.height());
    pButtonMinus->setMinimumWidth(1);
    pLayout->addWidget(pButtonMinus, 2, 1);

Вот проект, он должен откомпилироваться и запуститься:
Скачать 2del_4.zip с WebFile.RU


PS
Если окно растянуть, все поедет. Этого избежать можно, настроив setColumnStretch и setRowStretch лайоутов.
« Последнее редактирование: Январь 19, 2011, 15:00 от dd » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.141 секунд. Запросов: 21.