Qt FramelessWindowHint和WA_TranslucentBackground字体渲染

时间:2013-05-06 06:14:50

标签: c++ qt windows-7

我正在编写一个带有自定义窗口shell的应用程序。外壳有圆角和透明度。以下是我如何执行此操作的示例代码:

MyWindow::MyWindow (void) : QMainWindow (NULL, Qt::FramelessWindowHint)
{
    setAttribute (Qt::WA_TranslucentBackground);
    setAttribute (Qt::WA_NoSystemBackground   );
}

问题是每当我使用带有FramelessWindowHint的WA_TranslucentBackground时,字体渲染变得很糟糕,请参见下图。我有一个通过全局CSS设置的自定义应用程序样式。我尝试使用其他字体,例如Segoe UI,但该字体也会被更改。

enter image description here

关于为什么会发生这种情况的任何想法以及我可以采取哪些措施来解决这个问题。我在Qt 5.0.2中使用C ++

1 个答案:

答案 0 :(得分:1)

看起来我可能找到了解决方案。首先,如果您不想使用Qt :: WA_TranslucentBackground,可以使用QWidget :: setMask来获得圆角。以下是我提出的示例代码:

void MyWindow::setVisible (bool visible)
{
    // Call the default event
    QMainWindow::setVisible (visible);

    // Set a rounded mask (size() needs to be correct)
    QBitmap t (size());
    t.fill (Qt::color0);

    QPainter p (&t);
    p.setBrush (Qt::color1);
    p.drawRoundedRect (rect(), 5, 5);

    setMask (t);
}

对于透明度,您必须使字体更喜欢抗锯齿。您可以将其放在应用程序的开头。

    QFont font = QApplication::font();
    font.setStyleStrategy (QFont::PreferAntialias);
    QApplication::setFont (font);

不完美,但它解决了我遇到的问题。