Qt6:在没有任何抗锯齿的情况下应用字体 - 不尊重任何策略

问题描述 投票:0回答:0

我正在尝试使用 QPainter 渲染文本,但我不想应用抗锯齿。我是 QT 的新手,所以这里可能做错了什么。无论我尝试过什么,总会有某种抗锯齿功能。我将在下面分享我的代码,其中包含一些关于各种不同的东西的注释行

class TextExample : public QMainWindow {
protected:
    void paintEvent(QPaintEvent* aEvent) override {
        QPainter painter(this);

        painter.setRenderHint(QPainter::Antialiasing, false);
        painter.setRenderHint(QPainter::TextAntialiasing, false);
        painter.setRenderHint(QPainter::SmoothPixmapTransform, false);
        painter.setBrush(Qt::black);

        QFont myFont{"Times New Roman", 12};
        myFont.setStyleStrategy(QFont::NoAntialias);
        painter.setFont(myFont);

        // painter.drawStaticText(QPoint{0,0}, QStaticText{"Hello, world!"});

        painter.drawText(10, 50, "Hello, world!");

        // QTextDocument td;
        // td.setHtml("Hello, world!");
        // td.drawContents(&painter);
    }
};

int main(int aArgc, char *aArgv[]) {
    QApplication myApplication{aArgc, aArgv};

    // QFont myFont{"Informal Roman", 12};
    // myFont.setStyleStrategy(QFont::NoAntialias);
    // myFont.setStyleStrategy(QFont::NoSubpixelAntialias);
    // QApplication::setFont(myFont);

    for (const auto myStr : QFontDatabase::families()) {
        qDebug() << myStr;
    }

    TextExample myMainWindow;
    myMainWindow.setWindowTitle("Text Example");
    myMainWindow.resize(800, 600);
    myMainWindow.show();

    return myApplication.exec();
}

我在 qt 6.4.0 中运行它,如果这在 Windows 10 上很重要

需要注意的是,它确实可以与 QPainterPath 一起使用,但我宁愿避免这种情况,因为它更昂贵,而且似乎还有其他绘制文本的问题。

另一件需要注意的事情是,据我所知,有些字体没有抗锯齿功能,一个很好的例子是“MS Sans Serif”。但是为我产生了一个很好的不太友好的警告,同样 QT 不尊重使我能够为这些添加抗锯齿的策略,

DirectWrite: CreateFontFaceFromHDC() failed (Indicates an error in an input file such as a font file.) for QFontDef(Family="MS Sans Serif", pointsize=12, pixelsize=16, styleHint=5, weight=400, stretch=100, hintingPreference=0) LOGFONT("MS Sans Serif", lfWidth=0, lfHeight=-16) dpi=144

任何帮助将不胜感激

c++ qt qpainter qt6 drawtext
© www.soinside.com 2019 - 2024. All rights reserved.