Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: sq_vasya от Август 11, 2010, 12:16



Название: Как обрезать виджет?
Отправлено: sq_vasya от Август 11, 2010, 12:16
Всем привет.

Есть виджет верхнего уровня (Родитель), который содержит в себе Чайлд (если конкретно, это QLabel). Мне нужно, чтобы Чайлд показывался не полностью, а только его нижняя половина. При этом сам Чайлд должен находится в центре Родителя. Это очень упрощённый вариант реальной задчи.

Пробовал в этой связи юзать нечто вроде

Код:
void Widget::paintEvent(QPaintEvent* aEvent)
    {
    QPainter painter(this);
    QRect clippingRect( 100, 100, 100, 100 );
    painter.setClipRect( clippingRect );
    }

но необходимый результат получен не был, Чайлд как рисовался полностью, так и рисуется.

Пробовал юзать QLabel::setGeometry()  но таким образом можно обрезать только низ и справа. А мне нужно обрезать конкретно верх.

Подскажите пожалуйста, как решить эту задачу.

WBR


Название: Re: Как обрезать виджет?
Отправлено: Marat(Qt) от Август 11, 2010, 14:04
Можно перекрыть виджет другим виджетом(label с autoFillBackground например), но тут будут нюансы с лайотами, нюансы разрешимы, но разрешать их вам придется самостоятельно.


Название: Re: Как обрезать виджет?
Отправлено: Igors от Август 11, 2010, 14:18
Не проверял но первое что приходит в голову: вставить "обрезаемый" виджет в другой, который меньше его. И менять координаты обрезаемого внутри его parent'а


Название: Re: Как обрезать виджет?
Отправлено: whirlwind от Август 11, 2010, 14:26
создать собственный layout, который будет выравнивать виджет так, как вам надо


Название: Re: Как обрезать виджет?
Отправлено: sq_vasya от Август 11, 2010, 14:48

Можно перекрыть виджет другим виджетом(label с autoFillBackground например), но тут будут нюансы с лайотами, нюансы разрешимы, но разрешать их вам придется самостоятельно.

Спасибо за ответ. Да, это можно использовать в конкретном и это будет работать корректно. В моём живом приложении реализовать это будет намного сложнее, т.к. там используется очень много виджетов и лэйаутов. Порядок отрисовки не всегда один и тот же и завист от входных данных. Я пробовал так делать (забыл указать в посте, т.к. счёл этот метод очень работоёмким и отложил его на случай, если вообще по другому никак не получиться).

Не проверял но первое что приходит в голову: вставить "обрезаемый" виджет в другой, который меньше его. И менять координаты обрезаемого внутри его parent'а

Просто, как всё гениальное. Это действительно работает. Проверил на тестовом приложении. Попробую вставить в рабочий проект, думаю, должно работать.

Всем спасибо огромное за помощь и советы.