c++ - Qt:使用 QPainter 渲染的垂直文本的抗锯齿

标签 c++ qt

我已经实现了一个类似于此示例的定向 QPushButton(在我的例子中是一个绘图的轴标签): Vertical QLabel, or the equivalent? 这是当前的 paintEvent:

void OrientedPushButton::paintEvent(QPaintEvent* ev) {

if (mOrientation == Qt::Vertical) {

    QPainter p(this);

    // support focus/hover styles
    QStyleOption opt;
    opt.init(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);

    // text render hint
    p.setRenderHints(QPainter::TextAntialiasing);
    p.rotate(-90);

    QRect r(0, 0, -height(), width());
    p.drawText(r, Qt::AlignHCenter | Qt::AlignVCenter, QPushButton::text());
}
else    // default drawing for horizontal buttons
    QPushButton::paintEvent(ev); 
}

呈现的 QPushButton 看起来像这样:

screenshot

特别是对于“A”,可以看到垂直 QPushButton 变得更清晰。有没有办法渲染垂直文本,以便应用与水平文本相同的抗锯齿?

[编辑] 我尝试了@PavelStrakhov 提出的像素图渲染,虽然这种方法对垂直文本应用抗锯齿,但它不能解决清晰类型问题:different text rendering

最佳答案

this question 中也解决了这个问题,似乎(还)没有一致的跨平台解决方案。您可以创建一个像素图并在其上水平绘制文本,然后旋转该像素图并将其绘制在小部件上:

QPixmap pixmap(size());
pixmap.fill(Qt::transparent);
QPainter p2(&pixmap);
p2.setRenderHints(QPainter::TextAntialiasing);
p2.drawText(pixmap.rect(), Qt::AlignHCenter | Qt::AlignVCenter, 
            QPushButton::text());
p2.end();
pixmap = pixmap.transformed(QTransform().rotate(-90));
#todo: cache pixmap
#...
p.drawPixmap(rect(), pixmap);

创建和旋转像素图是相对昂贵的操作,不应在每次重绘时都进行。但是您可以将其存储在 QCache 中,或者在第一代之后仅存储在成员变量中。

关于c++ - Qt:使用 QPainter 渲染的垂直文本的抗锯齿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31043332/

相关文章:

c++ - 如何计算 vector 的大小

c++ - C++ const 全局变量的链接?

c++ - 找不到 qgsapplication.h 和其他头文件

c++ - 如何删除 TreeView 中所选项目下的所有项目

linux - QtBlueTooth 在 Linux 上不起作用

c++ - 复制构造函数中省略号的含义是什么?

c++ - 制作一个复制构造函数,对输入对象进行深度复制(使用数组)

c++ - 为什么在循环中调用 ReadConsole 会破坏堆栈?

c++ - Qt 4.8 - 并排应用程序运行时错误

python - 使用 QPainter 更改线条的位置