A (не такой уж сложный способ), чтобы нарисовать растровое изображение самостоятельно. Вместо того, чтобы создавать подклассы QLabel
и переопределять paintEvent
, вы можете установить фильтр событий в свой ярлык и прослушивать только QPaintEvent
.
Есть фильтр:
class Filter : public QObject
{
Q_OBJECT
public:
Filter(): QObject(nullptr) {}
bool eventFilter(QObject *watched, QEvent *event);
};
В методе eventFilter
всегда возвращается false, но при рисовании растрового изображения:
#include <QPaintEvent>
#include <QPainter>
#include <QStyle>
bool Filter::eventFilter(QObject *watched, QEvent *event)
{
if(event->type() == QEvent::Paint)
{
QLabel * label = dynamic_cast<QLabel*>(watched);
QPainter painter(label);
QPixmap pixmap = label->pixmap()->scaled(label->size());
label->style()->drawItemPixmap(&painter, label->rect(), Qt::AlignHCenter | Qt::AlignVCenter, pixmap);
return true;
}
return false;
}
Создание и установка фильтра, что-то вроде:
ui->setupUi(this);
Filter * filter = new Filter();
ui->label->installEventFilter(filter);
/* don't forget to call:
delete filter;
somewhere later */
В моем примере кода я масштабировал растровое изображение, чтобы он соответствовал размеру метки, и отцентрировал его по горизонтали и вертикали, но вы можете настроить все это в соответствии со своими потребностями.
Кроме того, один и тот же фильтр может быть установлен более чем на одну метку, поскольку логика для них всех работает нормально. Подробнее о фильтрации событий здесь .