我已经实现了一个类似于此示例的定向 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 看起来像这样:
特别是对于“A”,可以看到垂直 QPushButton 变得更清晰。有没有办法渲染垂直文本,以便应用与水平文本相同的抗锯齿?
[编辑] 我尝试了@PavelStrakhov 提出的像素图渲染,虽然这种方法对垂直文本应用抗锯齿,但它不能解决清晰类型问题:
最佳答案
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/