2

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

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

问题是每当我将 WA_TranslucentBackground 与 FramelessWindowHint 一起使用时,字体渲染就会变得很糟糕,请参见下图。我通过全局 CSS 设置了自定义应用程序样式。我尝试使用其他字体,例如 Segoe UI,但是该字体也发生了变化。

在此处输入图像描述

关于为什么会发生这种情况以及我可以做些什么来解决这个问题的任何想法。我正在使用带有 Qt 5.0.2 的 C++

4

1 回答 1

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);

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

于 2013-05-06T18:53:30.310 回答