

C++ - Pretypovanie v Qt
Problém je ten, že ak napíšem niečo takéto, síce to prejde, ale nemám zobrazené znaky s diakritikou:
str = QString::fromUtf8("Deň");
Toto mi odmieta skompilovať:
QString str;
str = QString::fromUtf8((const char *)str.sprintf("%d. deň v roku", den));
Nefunguje to ani takto:
str = QString::fromUtf8(str.sprintf("%d. deň v roku", den));
Túto premennú potom vkladám do QLabel:
ui->lblPopis->setText(str);
Predpokladám, že je problém iba v pretypovaní, ale netuším čo s tým. Mohli by ste mi poradiť ako to správne pretypovať? Prípadne, ak by ste mi mohli poradiť, ako to vložiť celé do jedného riadku ui->lblPopis->setText(...).
Ahoj,
jak správně píše MM.., je potřeba použít editor podporující UTF-8 (a soubor uložit jako UTF-8!) nebo použít něco z následujících řešení:
Horší řešení je použít něco jako:
Mnohem lepší je pak použít Qt Linguist, kde je možné veškeré řetězce vyskytující se v aplikaci přeložit do libovolného jazyka. Jen je pak nutné s aplikací dodávat i soubor *.qm a ještě před zobrazením hlavního formuláře aplikace správně načíst tento jazykový soubor. To se dělá takto:
Soubor *.qm pro českou verzi by byl myapp_cs.qm. Ještě pozor na ty systémové řetězce - v tomto příkladě se soubor obsahující překlady hledá v instalačním adresáři Qt.
EDIT: Po přečtení vlákna vidím, že má odpověď je mimo
Takže to prosím ignorujte, možná někomu může přijít zajímavý ten QtLinguist, tak to nemažu.
Správná odpověď by teda měla být tato:
Formátování se v Qt dělá takto:
A keby chcem 2 argumenty, čo potom? Dokumentácia sa tvári tak, ako keby to nešlo. Konkrétne som skúšal %s %d a nesformátovalo to. Nevadí, hlavne, že funguje sprintf aj s UTF-8 formátovacím reťazcom.
Podle mě by mělo jít:
ale nezkoušel jsem to.
Funkce arg má mnoho přetížení pro QString, jde tam nacpat "libovolný" počet QStringů za sebe.. takže třeba: QString("%1. deň v roku %2").arg(QString("%1").arg(den), QString("%1").arg(rok))
ale to je fuj. Rozhodně doporučuji použít QtLinguist.
Takže toto pomohlo, samozrejme musel som Qt prinútiť, aby zobralo aj UTF-8. To som dosiahol tak, že som vymazal súbor *.pro.user.
A vies vobec co si to urobil? Konvertujes Latin1->Qstring(UTF16)->toASCII->fromUTF8 do QString(UTF16)
Sa divim ze z compileru nevyskocil pri kompilovani boxer :)
P.S. najlepsie je pouzivat .arg priamo pri inicializacii QStringu, tak jak napisal hvezd vyssie priklad (a k tomu asi by bol dobry UTF8 editor alebo mozno u8 pred ten string). potom sa to ale NErobi vsetko v jednom riadku ale v dvoch - najprv inicializujes QString a potom ho niekam priradis.
Áno, neskôr som zistil, že ani to nie je ideálne riešenie a prešiel som na arg(). Musím uznať, s tým to funguje tak ako má.
Doplnené: sprintf() protestoval, ak som okrem int chcel dať ďalší parameter QString. S arg() žiadny problém nebol, len som zistil, že miestami je dokumentácia poslabšia a musel som skúšať metódou pokus omyl. Ale možno sa mýlim a v dokumentácii to je. Nevedel som nájsť čo znamená ktorý znak pre formátovanie reálnych čísel. Pokusmi som zistil, že 'e' je exponent, 'f' je zobrazenie podľa určeného formátovania a 'g' je zobrazenie čísla bez akejkoľvek straty pri desatinných hodnotách.