You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

JKQTMathText的drawIntoPixmap方法在devicePixelRatio≠1时存在公式裁剪问题

JKQTMathText的drawIntoPixmap方法在devicePixelRatio≠1时存在公式裁剪问题

看起来你遇到的这个裁剪问题确实很可能是JKQTMathText库在处理高DPI(devicePixelRatio>1)场景时的一个小疏漏,但也有几个你可以自查或临时解决的方向,我来帮你梳理下:

可能的原因

drawIntoPixmap这个快捷方法在内部计算生成Pixmap的尺寸时,大概率没有正确将公式的逻辑尺寸乘以devicePixelRatio,导致实际生成的Pixmap像素尺寸不足以容纳高DPI下渲染的公式内容,最终出现裁剪。

临时解决方法:手动控制Pixmap尺寸与绘制

绕开drawIntoPixmap的自动尺寸计算,自己创建对应DPI的Pixmap并完成绘制,这样能确保尺寸足够:

#include <jkqtmathtext/jkqtmathtextlabel.h>
#include <QApplication>
#include <QPainter>

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    
    JKQTMathText mathText;
    mathText.useXITS();
    mathText.setFontSize(20);
    mathText.parse("$\\sqrt{\\frac{\\sin\\left(\\frac{1}{2}\\right)}{2}}$");

    // 原方法:dpr=1正常
    mathText.drawIntoPixmap(false, Qt::white, 0, 1).save("img1.png");

    // 修复后的dpr=2绘制逻辑
    int dpr = 2;
    // 获取公式的逻辑显示尺寸
    QSizeF logicalSize = mathText.getSize();
    // 创建对应DPI的Pixmap,物理尺寸=逻辑尺寸×dpr
    QPixmap pixmap(logicalSize.width() * dpr, logicalSize.height() * dpr);
    pixmap.setDevicePixelRatio(dpr);
    pixmap.fill(Qt::white);

    QPainter painter(&pixmap);
    // 使用逻辑坐标绘制,QPainter会自动适配DPR
    mathText.draw(&painter, QPointF(0, 0));
    painter.end();

    pixmap.save("img2_fixed.png"); // 不会再裁剪

    return a.exec();
}

其他建议

  • 检查库版本:如果你用的是较旧的JKQTMathText版本,这个高DPI适配问题可能已经在新版本中被修复,尝试更新到最新稳定版看看问题是否消失。
  • 确认自身使用逻辑:作为Qt新手,你的复现代码逻辑是完全正确的,能精准复现问题已经很厉害了!这个裁剪问题更偏向于库的实现细节缺陷,而非你的使用错误。
  • 反馈问题:如果手动绘制的方法能解决你的需求,暂时可以先用这个方案;如果需要官方修复,你可以在JKQTMathText的代码仓库提交Issue,附上你的复现代码和裁剪前后的截图,帮助开发者定位修复。

火山引擎 最新活动