В последних версиях Qt (начиная с 4.5) получить полупрозрачное окно совсем просто -- достаточно выставить атрибут виджета WA_TranslucentBackground. К сожалению, при работе с более ранними версиями фреймворка (да ещё и под X11, да ещё и без композитинга) полупрозрачность даётся чуть сложнее.
Заработал у меня только самый дубовый метод -- копирование того, что лежит под диалоговым окном в картинку и отрисовка этой картинки на заднике диалога, поверх которого уже рисуются полупрозрачные виджеты (Qt без проблем рисует их ещё с версии 4.1, проблемы с прозрачностью окон). Но даже такой подход требует некоторых ухищрений.
Для получения содержимого экрана можно воспользоваться двумя методами: QPixmap::grabWidget() и QPixmap::grabWindow(). Для начала я попробовал первый метод для родительского виджета (parentWidget()) диалога. Но из-за структуры UI возникла проблема: в приложении используется основная форма и куча фреймов, которые вынесены в отдельные классы. При этом код создания диалога вызывается в фреймах. Если в качестве родительского виджета передавать собственно фрейм, то в тех областях диалога, которые выходят за его границы (а фрейм занимает не весь экран), полупрозрачности не будет.
Метод с grabWindow() тоже заработал не сразу. В документации честно написано, что под X11 наблюдается следующая лажа: если поверх основной формы видно другое окно, то область, перекрываемая этим окном, не будет инициализирована. Так оно и есть. Можно получить изображение всей формы кроме того прямоугольника, где отображается диалог. Однако тут выручает то, что в приложении по задумке нельзя двигать диалоги. Поэтому изображение подложки можно скопировать в showEvent(), когда диалога ещё не видно. В итоге, финальный код выглядит так:
void MessageBox::showEvent(QShowEvent *event) { QDialog::showEvent(event); if (m_background.isNull()) { QPoint p = mapToGlobal(QPoint(0, 0)); m_background = QPixmap::grabWindow(QApplication::desktop()->winId(), p.x(), p.y(), width(), height()); } } void MessageBox::paintEvent(QPaintEvent *) { QPainter painter(this); painter.drawPixmap(QPoint(0, 0), m_background); }
Как всегда, ради итоговых 10 строк кода было потрачено два дня на эксперименты. Чтобы можно было двигать полупрозрачный диалог нужно ещё перегрузить moveEvent()/resizeEvent() и как-то разобраться с неинициализированными областями. Но это уже совсем другая история.
Вам это будет интересно!
Последние новости
Конструкции стен из кирпича
Стены, выложенные из кирпича, по сравнению с деревянными характеризуются значительно большей прочностью и устойчивостью. Помимо этого, в число их достоинств входят долговечность и способность сохранять первоначальные качества при длительном воздействии неблагоприятных внешних физико климатических факторов. Для сооружения жилых построек современная стро...Читать далее »
Ограждающие конструкции - современные решения
Для того чтобы правильно подобрать способ теплоизоляции жилой постройки и вид утеплителя, важно знать основные характеристики конструкционных элементов, составляющих здание, и материалов, используемых для их выполнения. Чтобы получить жилище, которое будет отвечать всем требованиям комфорта и безопасности, при проектировании особое внимание следует уделять ...Читать далее »
Пробковые утеплители
Одним из высокоэффективных современных утепляющих материалов считаются плиты, изготовленные из измельченной коры пробкового дуба. Среди их главных достоинств следует назвать небольшой вес, твердость, прочность и устойчивость к гниению и образованию плесени при воздействии влаги. Пробковые теплоизолирующие материалы не повреждаются грызунами и не разрушаются...Читать далее »
Выполнение теплоизоляции пола и перекрытий
Помимо повышения теплотехнических качеств стен, окон и кровли, для создания благоприятных микроклиматических условий в доме необходимо утеплять пол и потолочные перекрытия. Пол можно считать особой конструкцией в жилой постройке, поскольку человек пребывает почти в постоянном контакте с ним. Именно поэтому важно выбрать такую конструкцию и вид теплоизоляции, ...Читать далее »
Приложение
Утепление окна стекловолокном – обязательное условие, при котором значительно снизятся теплопотери. Теплоизоляция кирпичного дома плитами пенополистирола – надежный способ сделать жилище теплым и комфортным. Как сделать это правильно, показано на рис. 50. ...Читать далее »
Пенополистирольные утеплители
В последнее время на строительном рынке особенно высоким спросом пользуется теплоизолирующий материал URSA XPS. Его выпускают в форме жестких плит, размер которых составляет 1,25 × 0,6 м. Сырьем для производства данного материала является экструдированный пенополистирол, обладающий структурой с закрытыми ячейками. URSA XPS – это утеплитель, главными свойствами которого являются устойчивость к воздействию влаги и высока...Читать далее »
Теплоизоляция - важная составляющая архитектуры здания
О доме, отличающемся от других построек изысканной и оригинальной архитектурой, мечтает каждый. Сегодня реализовать это желание несложно: достаточно всего лишь подготовить смелый проект и необходимые строительные материалы. Современные загородные мини городки удивляют своими необычными строениями с характерными для них сложной конфигурацией, резкой разницей высоты составляющих частей, французскими окнами и т. ...Читать далее »
