Dlaczego znak wyświetla się poprawnie, mimo że nie załadowałem faktycznej czcionki?

0

Użyłem niestandardowej czcionki aby wyświetlić ikonę image

Dlaczego Qt narysowało poprawny znak choć nie wybrałem nigdzie czcionki "FontAwesome" ?
Domyślna czcionka "MS Shell Dlg 2" nie posiada znaku "\uf083" , a po załadowaniu fontu QFontDatabase::addApplicationFont jednak sie rysuje znak aparatu

<RCC>
  <qresource prefix="/">
    <file alias="FontAwesome.otf">FontAwesome.otf</file>
  </qresource>
</RCC>
#include <QApplication>
#include <QLabel>
#include <QFontDatabase>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);


    if (QFontDatabase::addApplicationFont(":/FontAwesome.otf") < 0)
        qWarning() << "FontAwesome cannot be loaded !";

    QLabel w;
    QFont f;
    f.setPixelSize(32);
    w.setFont(f);
    qDebug()<< f.family();
    w.resize(100,100);
    w.setText("\uf083"); // aparat fotograficzny 

    w.show();
    return a.exec();
}

Czy nie powinno byc tak że jak znak jest poza zakresem czcionki to jest "kwadracik"
I dopiero jawne wywołanie
f.setFamily("FontAwesome");
powoduje ze znak się rysuje poprawnie ?
Chyba że Qt ma jakaś inną strategię , jak nie znajdzie znaku to szuka we wszystkich dostępnych czcionkach ?

Taka tylko ciekawostka :)

5
Marius.Maximus napisał(a):

Czy nie powinno byc tak że jak znak jest poza zakresem czcionki to jest "kwadracik"
I dopiero jawne wywołanie
f.setFamily("FontAwesome");
powoduje ze znak się rysuje poprawnie ?
Chyba że Qt ma jakaś inną strategię , jak nie znajdzie znaku to szuka we wszystkich dostępnych czcionkach ?

Współcześnie stosuje się podmianę fontów, wg reguł systemowych (na Linuksie odpowiada za to fontconfig, nie wiem jak na innych systemach).

Dzięki temu mogę napisać coś po chińsku — 完全沒有意義的東西 — i Ci się to wyświetli w miarę normalnie (jeśli tylko masz zainstalowany jakiś font z tymi znakami), bez konieczności ustawiania niczego dodatkowego w CSS-ie.

Albo, czasami, przez to widać bardzo brzydką podmianę fonta, jeśli ktoś pisze coś z polskimi znaczkami, a sobie nie sprawdzi, czy jego font tak ma. Ja mam też całkiem zabawny problem ze znaczkiem ™ w RSS-ach:screenshot-20230719150557.png

0

@Althorion , dziękuje za wytłumaczenie, takie podejście wydaje sie najbardziej rozsądne.

0

Zauważyłem jedna małą i ciekawą przypadłość związana z używaniem czcionki "FontAwesome" w trybie "Font substitution" vs f.setFamily("FontAwesome");

W vscode mam trzy debugery: gdb, lldb, CodeView

Jak używam formatu CodeView to aplikacja ma wyjatek w funkcji QPainter::boundingRect dla tekstu zawierającego znaki z FontAwesome

Exception has occurred: CPP/CacheOverflowException
Exception thrown at 0x0... in i.exe: Microsoft C++ exception: CacheOverflowException at memory location 0x0....

Oczywiscie w trybie Release wszystko działa, na gdb i lldb tez działa i zaczyna działać poprawnie na CodeView po ustawieniu f.setFamily("FontAwesome");

Ot ciekawostka na długie zimowe wieczory :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1