Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: andrew.k от Октябрь 05, 2011, 20:32



Название: Рисование вне клиентской области
Отправлено: andrew.k от Октябрь 05, 2011, 20:32
Возможно ли это средствами qt?
Т.е. например, покрасить рамку окна в другой цвет.
Пробовал по-разному, каждый раз получаю ошибку, что QPainter не готов.
Возможно ли это вообще?


Название: Re: Рисование вне клиентской области
Отправлено: Bepec от Октябрь 06, 2011, 08:26
Насколько я знаю - нельзя.

Но есть обходной маневр - отрисовывать полностью свою форму в том числе и с заголовком и кнопками(соответственно переопределять кнопки закрытия, свертывания, развертывания самому. Перемещение и растягивание аналогично)

В результате у тебя на экране будет эм.. "картинка" с нарисованным заголовком и прочими деталями, которая для пользователя будет казаться просто окном :)



Название: Re: Рисование вне клиентской области
Отправлено: andrew.k от Октябрь 06, 2011, 08:56
это все понятно, интересует сабж


Название: Re: Рисование вне клиентской области
Отправлено: GreatSnake от Октябрь 06, 2011, 09:20
это все понятно, интересует сабж
Если отрисовкой декораций окна не занимается непосредственно ваше приложение, т.е. не влючен Qt::FramelessWindowHint, то этим занимается менеджер окон.


Название: Re: Рисование вне клиентской области
Отправлено: andrew.k от Октябрь 06, 2011, 14:10
понятно, что оконный менеджер.
Но переопределив winEvent и в нем отловив событие WM_NCPAINT я могу повлиять на отрисовку рамки.


Название: Re: Рисование вне клиентской области
Отправлено: Bepec от Октябрь 06, 2011, 14:51
Посмотрел событие - там же ясно написано, что если ты напишешь обработчик, то управление будет передано Qt, если не напишешь - то отдается снова системе.

Могу ошибаться, но тебе тогда опять таки придется перерисовывать все.

PS проверь, потесть. Помоему никто этой функций не интересовался тут ^^


Название: Re: Рисование вне клиентской области
Отправлено: andrew.k от Октябрь 06, 2011, 16:58
Меня все не интересует, интересует только рамка.
Мне не удается инициализировать QPainter. Он постоянно ругается и ничего не рисует.
Говорит, что нельзя рисовать вне события paintEvent или это я прочитал где-то.
Есть флаг, который это вроде бы разрешает, но в ассистанте написано, что не работает под виндус.

Как это сделать?


Название: Просто тема
Отправлено: Bepec от Октябрь 07, 2011, 10:06
Warning: When the paintdevice is a widget, QPainter can only be used inside a paintEvent() function or in a function called by paintEvent(); that is unless the Qt::WA_PaintOutsidePaintEvent widget attribute is set. On Mac OS X and Windows, you can only paint in a paintEvent() function regardless of this attribute's setting.

made in Assistant.

скинь тестовый пример, и определение того, что ты хочешь сделать - тогда мб и попытаю Qt.


Название: Re: Рисование вне клиентской области
Отправлено: Fess от Октябрь 07, 2011, 12:50
Видимо QPainter не позволит рисовать вам рамку.
Но переопределив winEvent и в нем отловив событие WM_NCPAINT я могу повлиять на отрисовку рамки.
И рисовать вам ее прийдется так же средствами winAPI..
QPainter-ом в этом случае можно будет максимум отрисовать QImage и вывести содержимое в место назначения уже другими средствами.
Если рисовать всю рамку, то Qt::FramelessWindowHint как-то попроще будет, а если задача на штатное обрамление окна вывести что-то еще, то можно и поизвращаться :)


Название: Re: Рисование вне клиентской области
Отправлено: Igors от Октябрь 07, 2011, 14:47
Как это сделать?
Нет ничего особо страшного в "frameless", и он имеет свои плюсы (действительно custom, оригинальный вид окон приложения на всех платформах). А начинать бодягу "только из-за цвета рамочки" смысла никакого, т.к. результат несоразмеримо мал по сравнению с затраченными усилиями.


Название: Re: Рисование вне клиентской области
Отправлено: Fess от Октябрь 07, 2011, 15:00
а вообще, ничего лучше нативных окошек нет и быть не может
если только это не очередной WinAmp и пр.


Название: Re: Рисование вне клиентской области
Отправлено: andrew.k от Октябрь 07, 2011, 16:21
я совершенно согласен, но не всегда мы делаем то, чего хотим ;)


Название: Re: Рисование вне клиентской области
Отправлено: iroln от Октябрь 07, 2011, 22:54
Вот тут рисуют виджеты в заголовке окна: http://habrahabr.ru/blogs/qt_software/116752/