На этом шаге рассмотрим применение графических эффектов.
Графические эффекты можно применять на любые виджеты, а также и на объекты класса QGraphicsItem. Устанавливаются эффекты при помощи метода setGraphicsEffect(). Основным классом в иерархии графических эффектов является класс QGraphicsEffect. Всего доступно четыре эффекта: размытие (blur), расцвечивание (colorization), тень (drop shadow) и непрозрачность (opacity). Каждый из эффектов реализован в отдельном классе, каждый из которых унаследован от класса QGraphicsEffect (рис. 1).
Рис.1. Пример графических эффектов
Если четырех эффектов для вас недостаточно, то вы можете реализовать класс собственного эффекта, для этого будет необходимо унаследовать класс QGraphicsEffect и перезаписать метод draw(), потому что именно этот метод вызывается всякий раз, когда эффект нуждается в перерисовки. В этом методе в вашем распоряжении будет указатель на объект QPainter, с помощью которого можно выполнить все необходимые графические операции.
Кроме того, графические эффекты можно очень удачно комбинировать с анимацией.
Покажем использование графических эффектов на примере, приведенном на рис. 1.
/*Функция lbl()создает виджеты надписей сразу с растровыми изображениями. В нее передается объект эффекта, который применятся вызовом метода setGraphicsEffect(). В случае, если указатель на объект эффекта равен нулевому значению, то это означает что объект эффекта отсутствует и метод применения эффекта вызываться не должен. В завершение из метода возвращается указатель на созданный виджет надписи*/ QLabel* lbl(QGraphicsEffect* pge) { QLabel* plbl = new QLabel; plbl->setPixmap(QPixmap("image.png")); if (pge) { plbl->setGraphicsEffect(pge); } return plbl; } /*В основной функции программы создаются объекты эффектов (указатели pBlur, pShadow, pColorize, pOpacity). При помощи табличного размещения QFormLayout мы размещаем надписи с виджетами, к которым были применены эффекты*/ int main(int argc, char** argv) { QApplication app(argc, argv); app.setApplicationDisplayName("Эффекты"); QWidget wgt; QGraphicsBlurEffect* pBlur = new QGraphicsBlurEffect; QGraphicsDropShadowEffect* pShadow = new QGraphicsDropShadowEffect; QGraphicsColorizeEffect* pColorize = new QGraphicsColorizeEffect; QGraphicsOpacityEffect* pOpacity = new QGraphicsOpacityEffect; //задание цвета расцвечивания pColorize->setColor(QColor(250,150,200)); QFormLayout* pform = new QFormLayout; pform->addRow("Нет эффектов", lbl(0)); pform->addRow("Размытие", lbl(pBlur)); pform->addRow("Тень", lbl(pShadow)); pform->addRow("Расцвечивание", lbl(pColorize)); pform->addRow("Прозрачность", lbl(pOpacity)); //задание отступа между картинками pform->setVerticalSpacing(20); wgt.setLayout(pform); wgt.show(); return app.exec(); }
Файлы приложения можно взять здесь.
На следующем шаге рассмотрим форматы графических файлов.