Многие из тех, кто имел дело с созданием интерфейса, периодически задумывались о своем кастомном красивом дизайне и нетрадиционной форме окна, к примеру с тенью, полупрозрачностью, округлостями и тому подобным. Ну если не сами задумывались, то заказчики то уж точно попадались, я знаю.
Какое-то время назад эта задача была достаточно сложной, и с точки зрения к примеру GDI до сих пор является велосипедом. Однако Qt предоставляет нам отличную возможность для создания любых интерфейсов.
К примеру, для демонстрации возможностей я взял обыкновенный градиент от черного к белому-прозрачному, созданный в Paint.NET (надеюсь все понимают, что разницы в том, создал я картинку во внешнем редакторе или сгенерировал в программе для данного примера нет никакой).
Моя программа — обычный виджет, который загружает в себя эту картинку и правильным образом ее отрисовывает. Как пример результата, получаем что-то подобное (виджет-картинка выше запущен поверх QtCreator):
Это лишь демонстрация возможностей — надеюсь, вы прекрасно понимаете, что если такой градиент работает как надо, то можно сделать любой по сложности интерфейс, используя полупрозрачность, тени, нестандартные формы на основе этого и т.п.
А теперь — решение задачи применительно к программированию и Qt. На самом деле все просто. Кроме того, что виджет рисует на себе изображение с альфа-каналом, я просто добавил две строчки в конструкторе виджета:
setAttribute(Qt::WA_TranslucentBackground); setWindowFlags(Qt::FramelessWindowHint);
Вторая строка обязательна — данный прием не будет работать, если окно будет содержать системную рамку. Хотя в общем-то ради изменения этой рамки на что-то свое и уникальное все это и затеивалось.
Этот прием на самом деле открывает широкое поле для создания виджетов на рабочем столе для всяких развлекательных и информационных нужд — будь то пузырьки с прогнозом погоды или пляшущее солнышко.
Comments
Скриншот непонятный. Покажи, как через твоё окно просвечивает что-нибудь другое, а не только Бездонная Чернота.
Ну я для теста делал такое окно: http://blog.ufna.ru/wp-content/uploads/2010/09/Безымянный.jpg
Для статьи получилось некрасиво, заменил градиентом :)
На скрине также есть ссылочка на скомпилированный пример — там окно можно поперемещать. Двойной клик — закрывает окно.
Небольшая поправочка:
согласно документации флаг Qt::FramelessWindowHint необходим только под Windows.
>:»On Windows the widget also needs the Qt::FramelessWindowHint window flag to be set.»
Точно, спасибо :)
Надо добавить, что это будет работать только с композитным WM
парень,ты лучший!