я пытаюсь сделать виджет qt, который показывает таблицу qlabels с шестнадцатеричными числами.
я передаю цифры на метки в виде готовых к печати строк, и метки работают правильно, но тип шрифта является системным по умолчанию (без засечек), который имеет разные размеры букв, поэтому числа, содержащие цифры «AF», больше не выровнены с другие цифры …
я изначально создаю шрифт с помощью функции:
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
s, но я, кажется, единственный, кто не заставляет их работать должным образом ..
Что я делаю неправильно??
Вы, вероятно, хотите Monospace
подсказка стиля, не Typewriter
, Следующее работает для меня на OS X под Qt 4 и 5.
Настройка QLabel для расширенного текста не требуется для вашего приложения.
Обратите внимание, что QFontInfo::fixedPitch()
это не то же самое, что QFont::fixedPitch()
, Последний позволяет узнать, запрашивали ли вы шрифт с фиксированным шагом. Первый указывал, действительно ли вы получили шрифт с фиксированным шагом.
// 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();
}
Других решений пока нет …