у меня есть QLabel
, а также Я хочу текст внутри него выгравировать, похож на текстово-теневой подход в CSS. Есть ли способ сделать это в Qt?
Гораздо проще, чем переопределить paintEvent
использует QGraphicsEffect, точно QGraphicsDropShadowEffect.
QGraphicsDropShadowEffect* effect = new QGraphicsDropShadowEffect();
effect->setBlurRadius(5);
effect->setXOffset(5);
effect->setYOffset(5);
label->setGraphicsEffect(effect);
и результат примерно такой:
Если вы хотите покрасить тень, вы можете легко добиться этого через QGraphicsDropShadowEffect :: SetColor функция-член.
Надеюсь это поможет.
Это может быть достигнуто путем переопределения события рисования метки в подклассе. Пример:
#include <QRect>
#include <QLabel>
#include <QPainter>
class QEngravedLabel : public QLabel
{
public:
explicit QEngravedLabel(QWidget *parent=0, Qt::WindowFlags f=0)
: QLabel(parent, f){};
explicit QEngravedLabel(const QString &text, QWidget *parent=0, Qt::WindowFlags f=0)
: QLabel(text,parent,f){};
protected:
virtual void paintEvent(QPaintEvent *pe) override
{
QRect toPaint(pe->rect());
QPainter painter(this);
toPaint.translate(0,1);
painter.setPen(QColor("#CCC")); // light shadow on bottom
painter.drawText(toPaint, this->alignment() ,this->text());
toPaint.translate(0,-2);
painter.setPen(QColor("#333")); // dark shadow on top
painter.drawText(toPaint, this->alignment() ,this->text());
toPaint.translate(0,1);
painter.setPen(QColor("#000000")); // text
painter.drawText(toPaint, this->alignment() ,this->text());
}
};
Эти теневые цвета предназначены для светло-серого фона.