Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno 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(...).

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Ahoj, jak správně píše MM.., je potřeba použít editor podporující UTF-8 (a soubor uložit jako UTF-8!…
hvězd 11.10.2011 20:34
hvězd
Správná odpověď by teda měla být tato: Formátování se v Qt dělá takto: str = QString("%1. deň v ro…
hvězd 11.10.2011 20:47
hvězd
A keby chcem 2 argumenty, čo potom? Dokumentácia sa tvári tak, ako keby to nešlo. Konkrétne som skúš…
msx. 11.10.2011 22:54
msx.
Podle mě by mělo jít: QString("%1. deň v roku %2").arg(den).arg(rok) ale nezkoušel jsem to. Funkc… nový
hvězd 12.10.2011 19:39
hvězd
Takže toto pomohlo, samozrejme musel som Qt prinútiť, aby zobralo aj UTF-8. To som dosiahol tak, že…
msx. 11.10.2011 22:47
msx.
A vies vobec co si to urobil? Konvertujes Latin1->Qstring(UTF16)->toASCII->fromUTF8 do QString(UTF16… nový
MM.. 12.10.2011 19:47
MM..
Á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… poslední
msx. 20.10.2011 20:21
msx.

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:

const QString str = QString::fromLocal8Bit("Deň");
ui->lblPopis->setText(str);

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:

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
 
        /** Nacteni systemovych stringu - zobrazuji se napr. v dialogu vyberu souboru, atd. */
	QTranslator qtTranslator;
        qtTranslator.load("qt_" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath));
        a.installTranslator(&qtTranslator);

        /** Nacteni stringu pro aplikaci, soubor se stringy se jmenuje myapp_{locale}.qm */
        QTranslator myappTranslator;
        myappTranslator.load("myapp_" + QLocale::system().name());
        a.installTranslator(&myappTranslator);

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

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 :-D Takže to prosím ignorujte, možná někomu může přijít zajímavý ten QtLinguist, tak to nemažu.

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:

QString("%1. deň v roku %2").arg(den).arg(rok)

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)) :-D 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.

ui->lblPopis->setText( QString::fromUtf8( str.sprintf( "%d. deň v roku", 1 ).toAscii() ) );

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.

Zpět do poradny Odpovědět na původní otázku Nahoru