На этом шаге рассмотрим использование масок для 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();
Файлы приложения можно взять здесь.
На следующем шаге рассмотрим создание нестандартного окна виджета.