Шаг 223.
Библиотека Qt.
Использование масок для QPixmap

    На этом шаге рассмотрим использование масок для QPixmap.

    В объектах класса QPixmap добиться прозрачности можно при помощи специальной маски, для установления которой необходимо вызвать метод QPixmap::setMask(). Размеры маски и растрового изображения, к которому она применяется, должны быть одинаковы. Маски создаются в объектах класса QBitmap. Для их создания можно воспользоваться объектом класса QPainter, при этом для прозрачного пиксела необходимо использовать цвет color0, а для непрозрачного — color1. Если маска не установлена, то все пикселы растрового изображения будут непрозрачны. Маски следует использовать в случаях острой необходимости, т. к. это существенно снижает быстроту вывода растрового изображения. На рис. 1 показан пример, в котором маской является надпись, выведенная заданным размером и шрифтом.


Рис.1. Маска в виде текста

/*создаем объект класса QPixmap, размеры которого устанавливаются
в соответствии с размерами виджета (метод size())*/
QPixmap pix(size());
QPainter painter;
/*после создания объекта рисования объект растрового изображения pix
устанавливается текущим контекстом с помощью метода begin()*/
painter.begin(&pix);
/*метод drawPixmap() отображает в области объекта pix растровое
изображение foto.jpg, после чего работа с контекстом заканчивается
вызовом метода end()*/
painter.drawPixmap(rect(), QPixmap("foto.jpg"));
painter.end();
//создаем объект маски bmp, размеры которого задаются исходя из размеров виджета
QBitmap bmp(size());
/*методом fill() маска инициализируется прозрачными значениями Qt::color0
(этот цвет используется по умолчанию)*/
bmp.fill();
painter.begin(&bmp);
/*текст на маске рисуется пером, имеющим значение цвета Qt::color1,
и, следовательно, в тех местах, где пикселы получили это значение,
после установки маски будут показаны пикселы оригинального изображения*/
painter.setPen(QPen(Qt::color1));
painter.setFont(QFont("Times", 75, QFont::Bold));
painter.drawText(rect(), Qt::AlignCenter, "МАСКА");
painter.end();
/*полученная маска устанавливается в объекте pix с помощью метода setMask(),
после чего изображение рисуется на контексте виджета*/
pix.setMask(bmp);
painter.begin(this);
painter.drawPixmap(rect(), pix);
painter.end();

    Файлы приложения можно взять здесь.

    На следующем шаге рассмотрим создание нестандартного окна виджета.




Предыдущий шаг Содержание Следующий шаг