Qt带阴影的文字

时间:2011-03-22 15:18:32

标签: qt text shadow qt-designer contrast

我在其他应用程序中看到了这一点,即使外观略微偏小,效果仍然是高对比度 - >更好的可读性。

例如Qt Designer左侧的标签,或者Adobe Photoshop顶部的标签:文本有一些阴影,文本周围只有1个像素,颜色对比鲜明。

使用Qt有一种简单的方法吗?还是更复杂的一个?

谢谢。

3 个答案:

答案 0 :(得分:5)

答案 1 :(得分:1)

有几种方法可以实现这种效果,但从概念上讲,您需要将其视为具有轻微偏移的两个文本图层。

我之前通过重新实现QWidget的paintEvent()方法并自己绘制文本图层来完成此操作。或者,您可以重新实现自定义QStyle的drawItemText()方法。但基本上就是它是如何完成的。

答案 2 :(得分:1)

这是我使用Qt5在所有按钮上执行文本阴影的方式。我不确定Qt4是否可行。

class MyProxyStyle : public QProxyStyle
{
public:

    void drawItemText(QPainter *painter, const QRect &rect, int flags, const QPalette &pal, bool enabled, const QString &text, QPalette::ColorRole textRole /* = QPalette::NoRole */) const
    {
        if (textRole == QPalette::ButtonText && dynamic_cast<QAbstractButton*>(painter->device()))
        {
            QPalette palShadow(pal);
            palShadow.setColor(QPalette::ButtonText, QColor(0, 0, 0, 100));
            QProxyStyle::drawItemText(painter, rect.adjusted(1, 1, 1, 1), flags, palShadow, enabled, text, textRole);
        }
        QProxyStyle::drawItemText(painter, rect, flags, pal, enabled, text, textRole);
    }
};

......在main()的某个地方

QApplication a;
a.setStyle(new MyProxyStyle);

如果删除QAbstractButton dynamic_cast,菜单标题也会被遮蔽,这并不总是令人满意。