Qt текст с тенью
Я вижу это в других приложениях, даже несмотря на то, что внешний вид очень незначительный, эффект значительно контрастнее -> лучшая читаемость.
Например, вкладки слева в Qt Designer или вкладки вверху в Adobe Photoshop: у текста какая-то тень, только 1 пиксель окружает текст контрастным цветом.
Есть ли простой способ сделать это с помощью Qt? Или более сложный?
Спасибо.
3 ответа
Есть несколько способов достижения этого эффекта, но концептуально вы должны рассматривать его как два текстовых слоя с небольшим смещением.
Я делал это раньше, повторно реализуя метод paintEvent() QWidget и рисуя текстовые слои самостоятельно. Или вы можете переопределить метод drawItemText() пользовательского QStyle. Но в основном так и делается.
Вот как я сделал тень текста на всех кнопках с 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, заголовки меню также будут затенены, что не всегда желательно.