Qt QFont选择等宽字体无效。

4
我正在尝试制作一个Qt小部件,显示一个QLable表格,其中显示十六进制数字。
我将数字作为QString传递给标签,准备打印,标签正常工作,但字体类型是系统默认字体(无衬线字体),具有不同的字母大小,因此包含“A-F”数字的数字不再与其他数字对齐...
我最初使用以下函数创建字体:
static const QFont getMonospaceFont(){
  QFont monospaceFont("monospace");  // tried both with and without capitalized initial M
  monospaceFont.setStyleHint(QFont::TypeWriter);
  return monospaceFont;
}

创建一个自定义的 QLabel 类,该类具有以下构造函数:

monoLabel(QWidget *parent = 0, Qt::WindowFlags f = 0) : QLabel(parent, f) {
  setTextFormat(Qt::RichText);
  setFont(getMonospaceFont());
}

但它没有起作用,所以我添加到主要文件中。
QApplication app(argn, argv);
app.setFont(monoLabel::getMonospaceFont(), "monoLabel");

字体仍然没有改变...

我在网上搜索了与 QLabel 字体设置问题相关的内容,但似乎只有我无法正确地使它们工作。

我做错了什么?

1个回答

5
你可能需要一个 等宽字体 样式提示,而不是 打字机。以下代码适用于我在 OS X 下的 Qt 4 和 5。
对于你的应用程序来说,将 QLabel 设置为富文本是不必要的。
请注意,QFontInfo::fixedPitch() 不同于 QFont::fixedPitch()。后者让您知道是否请求了固定间距字体,前者指示实际上是否得到了固定间距字体。 screenshot
// https://github.com/KubaO/stackoverflown/tree/master/questions/label-font-18896933
// This project is compatible with Qt 4 and Qt 5
#include <QtGui>
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
#include <QtWidgets>
#endif

bool isFixedPitch(const QFont &font) {
   const QFontInfo fi(font);
   qDebug() << fi.family() << fi.fixedPitch();
   return fi.fixedPitch();
}

QFont getMonospaceFont() {
   QFont font("monospace");
   if (isFixedPitch(font)) return font;
   font.setStyleHint(QFont::Monospace);
   if (isFixedPitch(font)) return font;
   font.setStyleHint(QFont::TypeWriter);
   if (isFixedPitch(font)) return font;
   font.setFamily("courier");
   if (isFixedPitch(font)) return font;
   return font;
}

int main(int argc, char *argv[]) {
   QApplication a(argc, argv);
   QString text("0123456789ABCDEF");
   QWidget w;
   QVBoxLayout layout(&w);
   QLabel label1(text), label2(text);
   label1.setFont(getMonospaceFont());
   layout.addWidget(&label1);
   layout.addWidget(&label2);
   w.show();
   return a.exec();
}

我正在使用Qt 4.8.2,QMake 2.01a(通过Qt Creator 2.5.0),在Debian Wheezy机器上(32位,最近更新于周一)。 - mellotanica
好的,我稍微更新了一下,让它尝试各种选项并输出调试信息。如果仍然失败,请在评论中发布调试输出。 - Kuba hasn't forgotten Monica
好的,这次它正常工作了(它打印出"DejaVu Sans Mono" true),并且以伪随机方式在我的项目中移动东西使更改发生...似乎在创建QApplication之后添加app.setFont(monoLabel::getMonospaceFont(), "parentWidget");,其中parentWidget是包含标签的类,是唯一实现标签中等宽字体的方法...它可以工作,我很满意,但我不明白为什么... - mellotanica
你真的不需要更改整个应用程序的字体。它应该在每个小部件上工作。 - Kuba hasn't forgotten Monica
我也曾这样想过,但如果我仅为标签设置字体,则没有任何效果,在我的程序中似乎唯一的方法是在实例化之前为标签的父部件类设置字体。 - mellotanica
你运行过我的示例吗?它能正常工作吗?如果是这样,请尝试将你的代码添加到其中,并查看它会在哪里出错。 - Kuba hasn't forgotten Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接