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,附上你的复现代码和裁剪前后的截图,帮助开发者定位修复。




