Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: z-word от Январь 18, 2011, 14:19



Название: QGridLayout. Одинаковый размер виджетов в ячейках
Отправлено: z-word от Январь 18, 2011, 14:19
Добрый день!

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

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

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

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

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

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

(http://imagepost.ru/images/486/VZ6TyliIu7D9.jpg)


Название: Re: QGridLayout. Одинаковый размер виджетов в ячейках
Отправлено: Fat-Zer от Январь 18, 2011, 14:55
а если чекбокс и кнопку в отдельный лейаут пихнуть? я бы вообще каждый ряд  в свой лейаут пихнул бы...


Название: Re: QGridLayout. Одинаковый размер виджетов в ячейках
Отправлено: z-word от Январь 18, 2011, 15:17
Не совсем понял. Т.е. из чекбокса и кнопки сделать один лейуат и запихнуть его в ячейку основного лейаута?
мне кажется проблема размеров останется, нет?
А если каждый ряд в свой лейаут, то тогда ведь внешний вид поменяется?


Название: Re: QGridLayout. Одинаковый размер виджетов в ячейках
Отправлено: dd от Январь 18, 2011, 15:20
Почему изменится то? Правильно человек говорит, лайаутов сколько угодно можно.
Только там по умолчанию отступы будут лишние. Их можно поубирать, поставив 0.
Не совсем понял, что нужно получить, лучше измени скрин в paint - е, как нужно получить и как есть сейчас.
Подскажем код.


Название: Re: QGridLayout. Одинаковый размер виджетов в ячейках
Отправлено: z-word от Январь 18, 2011, 15:31
Как есть сейчас - это в моём первом посте, а надо так как справа от кнопки "2", чтобы одинаковые по размерам чекбокс и кнопочка были.
(т.е. не так как справа от кнопки "1", видите там размер кнопочки "-" не "правильный")


Название: Re: QGridLayout. Одинаковый размер виджетов в ячейках
Отправлено: Fat-Zer от Январь 18, 2011, 15:36
пока вы не сказали, я эту разницу в 2 пикселя даже не замечал... тогда с размером по горизонтале проблемма должна решится... а по вертикале наверное придётся  костылями подпирать. НЕадо подумать...


Название: Re: QGridLayout. Одинаковый размер виджетов в ячейках
Отправлено: dd от Январь 18, 2011, 15:43
Ну я бы сделал так:
когда надо добавить очередную группу кнопок,
мекбоксу и маленькой кнопочке выставляешь setMinimumSize, как у чекбокса.
Далее создает QGridLayout, суем туда кнопки, лайоут добавляем в главный лайоут.
Все.


Название: Re: QGridLayout. Одинаковый размер виджетов в ячейках
Отправлено: z-word от Январь 19, 2011, 11:12
dd, а чем поможет setMinimumSize?
Это же для того, чтобы виджет нельзя было уменьшить меньше, чем размер переданный этой ф-ии.


Название: Re: QGridLayout. Одинаковый размер виджетов в ячейках
Отправлено: dd от Январь 19, 2011, 11:24
Layout не сможет сделать размер меньше размера чекбокса. В этом ведь суть топика?


Название: Re: QGridLayout. Одинаковый размер виджетов в ячейках
Отправлено: z-word от Январь 19, 2011, 11:46
Воспользуюсь советом:
Цитировать
лучше измени скрин в paint - е, как нужно получить и как есть сейчас.

это когда просто в лейаут пихаешь виджеты:
(http://imagepost.ru/images/490/LsBiYtsjSpIb_2.jpg)

а надо:
(http://imagepost.ru/images/490/AiN43tS5T89B.jpg)

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

надеюсь, сейчас понятно объяснил суть проблемы)


Название: Re: QGridLayout. Одинаковый размер виджетов в ячейках
Отправлено: dd от Январь 19, 2011, 12:05
Сейчас напишу пример и выложу )


Название: Re: QGridLayout. Одинаковый размер виджетов в ячейках
Отправлено: z-word от Январь 19, 2011, 12:36
Цитировать
Сейчас напишу пример и выложу )

супер!! жду)


Название: Re: QGridLayout. Одинаковый размер виджетов в ячейках
Отправлено: dd от Январь 19, 2011, 13:13
Короче сделал, как ты хотел.
Но тебе придется отказаться от идеи сделать кнопку размером с чекбокс.
Причина тому - темы оболочки.
Судя по скринам, у тебя не стоит тема XP.
У меня линукс, там стоит. Если ты поставишь тему у себя, все поплывет тоже.
Дело в том, что чекбокс и кнопка, будучи одного размера, имеют на вид не один размер.
Причина тому - разные борта, которые задаются в теме.

Вот скрин (http://i068.radikal.ru/1101/9d/ac16332ab2b0t.jpg) (http://radikal.ru/F/i068.radikal.ru/1101/9d/ac16332ab2b0.jpg.html)

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

А вообще лучше перепридумать интерфейс. Будет все плыть на разных темах + неудобно искать маленькие кнопочки.


Название: Re: QGridLayout. Одинаковый размер виджетов в ячейках
Отправлено: z-word от Январь 19, 2011, 14:43
Цитировать
Но тебе придется отказаться от идеи сделать кнопку размером с чекбокс.
в принципе, это не критично, чтобы размеры были одинаковые. Как у тебя на скрине тоже покатит.

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

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



Название: Re: QGridLayout. Одинаковый размер виджетов в ячейках
Отправлено: dd от Январь 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 (http://webfile.ru/5063824)


PS
Если окно растянуть, все поедет. Этого избежать можно, настроив setColumnStretch и setRowStretch лайоутов.


Название: Re: QGridLayout. Одинаковый размер виджетов в ячейках
Отправлено: z-word от Январь 19, 2011, 15:27
dd, спасибо тебе большое за разъяснения!

Просвети ещё пожалуйста вот в чём:
куда копать(что почитать) и сложно ли реализовать вот такой виджет:
(http://imagepost.ru/images/491/gKKW9UuC0PLE_3.jpg)
т.е. крестик на кнопке и на крестик можно нажать и, соотв., повесить обработчик на него


Название: Re: QGridLayout. Одинаковый размер виджетов в ячейках
Отправлено: dd от Январь 19, 2011, 15:52
Тебенужно только закрыть? Чекбокс уже не нужен?


Название: Re: QGridLayout. Одинаковый размер виджетов в ячейках
Отправлено: dd от Январь 19, 2011, 16:30
Вот сделал виджет, который содержит чекбокс и минус, собстенноручно отрисованные:
(http://habreffect.ru/files/982/d35e0f434/Снимок-Check_SET.png) (http://habreffect.ru/982/d35e0f434/Снимок-Check_SET.png)

Создан класс:
class WidgetCheckMinus : public QWidget

У него есть методы:
    bool isChecked();
    void setChecked(bool param);

Это установить флажок и получить его значение.

Также есть два сигнала:
    void signalMinusClicked();
    void signalCheckClicked(bool);

Это клик по минусу и по флажку.

Прилагаю проект, который демонстрирует, как пользоваться виджетом и его сигналами.
Думаю изменить код отрисовки под себя не составит труда.

Скачать 2del_4.zip с WebFile.RU (http://webfile.ru/5064086)


Название: Re: QGridLayout. Одинаковый размер виджетов в ячейках
Отправлено: z-word от Январь 20, 2011, 11:16
dd, это то что нужно!

Спасибо ещё раз!!!