Многие из тех, кто имел дело с созданием интерфейса, периодически задумывались о своем кастомном красивом дизайне и нетрадиционной форме окна, к примеру с тенью, полупрозрачностью, округлостями и тому подобным. Ну если не сами задумывались, то заказчики то уж точно попадались, я знаю.
Какое-то время назад эта задача была достаточно сложной, и с точки зрения к примеру GDI до сих пор является велосипедом. Однако Qt предоставляет нам отличную возможность для создания любых интерфейсов.
К примеру, для демонстрации возможностей я взял обыкновенный градиент от черного к белому-прозрачному, созданный в Paint.NET (надеюсь все понимают, что разницы в том, создал я картинку во внешнем редакторе или сгенерировал в программе для данного примера нет никакой).
Моя программа — обычный виджет, который загружает в себя эту картинку и правильным образом ее отрисовывает. Как пример результата, получаем что-то подобное (виджет-картинка выше запущен поверх QtCreator):
Это лишь демонстрация возможностей — надеюсь, вы прекрасно понимаете, что если такой градиент работает как надо, то можно сделать любой по сложности интерфейс, используя полупрозрачность, тени, нестандартные формы на основе этого и т.п.
А теперь — решение задачи применительно к программированию и Qt. На самом деле все просто. Кроме того, что виджет рисует на себе изображение с альфа-каналом, я просто добавил две строчки в конструкторе виджета:
setAttribute(Qt::WA_TranslucentBackground); setWindowFlags(Qt::FramelessWindowHint);
Вторая строка обязательна — данный прием не будет работать, если окно будет содержать системную рамку. Хотя в общем-то ради изменения этой рамки на что-то свое и уникальное все это и затеивалось.
Этот прием на самом деле открывает широкое поле для создания виджетов на рабочем столе для всяких развлекательных и информационных нужд — будь то пузырьки с прогнозом погоды или пляшущее солнышко.