Поиск по сайту


Вам это будет интересно!

  • Система ловушек в phpBB3 Часть 2. The phpBB3′ hook system. Part 2.

  • Мастер-класс по слингам и показ одежды для кормления



  • В последних версиях 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() и как-то разобраться с неинициализированными областями. Но это уже совсем другая история.




    Вам это будет интересно!

  • Система ловушек в phpBB3 Часть 2. The phpBB3′ hook system. Part 2.

  • Мастер-класс по слингам и показ одежды для кормления




  • Последние новости


    Пробковые утеплители

    Одним из высокоэффективных современных утепляющих материалов считаются плиты, изготовленные из измельченной коры пробкового дуба. Среди их главных достоинств следует назвать небольшой вес, твердость, прочность и устойчивость к гниению и образованию плесени при воздействии влаги. Пробковые теплоизолирующие материалы не повреждаются грызунами и не разрушаются...
    Читать далее »

    Приложение

    Утепление окна стекловолокном – обязательное условие, при котором значительно снизятся теплопотери. Теплоизоляция кирпичного дома плитами пенополистирола – надежный способ сделать жилище теплым и комфортным. Как сделать это правильно, показано на рис. 50. ...
    Читать далее »

    Пенополистирольные утеплители

    В последнее время на строительном рынке особенно высоким спросом пользуется теплоизолирующий материал URSA XPS. Его выпускают в форме жестких плит, размер которых составляет 1,25 × 0,6 м. Сырьем для производства данного материала является экструдированный пенополистирол, обладающий структурой с закрытыми ячейками. URSA XPS – это утеплитель, главными свойствами которого являются устойчивость к воздействию влаги и высока...
    Читать далее »

    Торфяные утеплители

    Для повышения теплоизоляционных характеристик ограждающих конструкционных элементов нередко используют торфоизоляционные плиты. Их производят на основе плохо разложившегося торфа, который отличается волокнистой структурой. В процессе обработки сырье формуют и выдерживают в условиях высокой температуры. Плотность торфоизоляционных плит составляет от 170 до 260 кг/м3, а коэффициент теплопроводности равен 0,06 Вт/(м°С)...
    Читать далее »

    Теория теплопередачи - основа строительства

    Современные физики говорят о 3 явлениях, выражающих теплопередачу, – теплопроводности, излучении и конвекции. Каждое из них обладает собственными характеристиками. Так, при определении свойств однородных твердых тел говорят о теплопроводности. Ее суть заключается в способности одного объекта передавать тепло другому при соприкосновении либо посредством промежуточного проводника (рис. 3). ...
    Читать далее »

    Древесно-стружечные теплоизолирующие материалы

    Одним из наиболее распространенных в настоящее время древесно стружечных утеплителей является фибролит. Его получают путем смешивания древесной стружки, портландцемента и воды. Древесная стружка, или древесная шерсть, при этом должна состоять из лент длиной не менее 50 см. В некоторых случаях портландцемент нередко заменяют магнезиальным вяжущим компонентом. Перед технологической обработкой древесную стружку, вы...
    Читать далее »

    Стеклянные утепляющие материалы

    Технология изготовления стекловаты во многом сходна с методом производства минеральной ваты. В качестве основного сырья выступают мел либо известняк, кварцевый песок и сульфат натрия либо сода. Кроме того, для получения этого утеплителя могут использоваться и остаточные продукты стекольной промышленности. Стеклянная вата состоит из тончайших волокон, которые получают путем вытягивания из предварительно расплавле...
    Читать далее »