Obarvení čísla v Qt

noname

Obarvení čísla v Qt
« kdy: 10. 12. 2013, 01:56:05 »
Zdravím všechny, mám drobný dotaz pro všechny zdejší odborníky na Qt.

Vytvářím si jako cvičení jednoduché okno s několika widgety (mimo jiné také QColorDialog, který bude určovat barvu určitého textu). Chci zde přidat jednoduchý widget na principu QLabelu, v němž by byla umístěn číselný údaj, který bude obarvený pomocí widgetu QColorDialog.

Jestli jsem pochopil správně, mohl bych sice využít samotný QLabel s využitím funkce setTextFormat(Qt::TextFormat) kde lze zvolit jako parametr Qt::RichText a následně html syntaxí dospět ke kýženému výsledku, ale chtěl jsem vytvořit "čistější" řešení, které by mě nenutilo převádět QColor na text udávající hexadecimální hodnotu barvy a ten vkládat do předpřipraveného řetězce.

Něco málo, co by mi mohlo v tomto směru pomoci jsem nakonec skutečně našel. Konkrétně se jedná o třídu QTextFormat, kde mohu pomocí funkce setForeground(QBrush&) nastavit barvu popředí (kde do QBrush přidám ještě barvu, případně další parametry). Jenže se mi bohužel nedaří zjistit, k čemu bych přesně měl ten QTextFormat přiřadit. Všechny příklady, které jsem dosud viděl vedou k daleko složitějším programům obsahujícím parsování textu a využití objektu QTextDocument, což mi přijde jako jít s kanónem na vrabce.

Našel jsem sice nějakou základní třídu, do které by se něco takového dalo nastavit, ale jednak je zjevně určená jako bázová třída pro nějaké další objekty, a k navíc funkce, kterou bych potřeboval pro nastavení daného objektu má nastavenu jako protected, díky čemuž ji nemůžu použít i kdybych chtěl (konkrétně se jedná o QTextObject). Víte někdo o nějakém jednodušším widgetu, kterému budu moci přiřadit QTextFormat a bude sloužit jako obyčejný obarvený QLabel (nechci, ať to vypadá podobně jako QTextEdit) nebo mi nezbyde, než vytvořit pomocí dědičnosti nový objekt, kde budu pomocí Qt::RichText a html syntaxe přidávat barvu, font a velikost písma (případně další parametry)? Vidíte případně nějaký jiný způsob, jak elegantně řešit takovéto zadání?

Díky všem předem za odpovědi!
« Poslední změna: 10. 12. 2013, 10:14:03 od Petr Krčmář »


noname

Re:Obarvení čísla v Qt
« Odpověď #1 kdy: 12. 12. 2013, 17:18:49 »
Zdravím všechny  ;D. Nejdříve bych chtěl poděkovat za perfektní reakce  ;). Každopádně jsem KONEČNĚ přišel na řešení, takže kdyby to tady někoho zajímalo, tak tady přepíšu základ.

Chci-li měnit barvy widgetu (nejen QLabelu) mohu velice jednoduchým způsobem využít funkci setPalette(QPalette&) zděděnou od rodičovské třídy QWidget, pomocí které se nastaví všechny barvy podle potřeby. Tento objekt si tedy nejdříve musím vytvořit, k čemuž je podle mého názoru nejlepší tento způsob QPalette palette = label->palette() (label představuje odkaz na QLabel), díky čemuž můžu velice jednoduše nastavit pouze tu barvu, kterou potřebuji pomocí funkce setColor(Palette::ColorGroup, Palette::ColorRole, color&), tedy v mém případě pallette.setColor(QPalette::Active, QPalette::WindowText, color) (proměnná color je instancí třídy QColor s nastavenou barvou).

Pokud budu chtít změnit font textu, je to obdobný případ, využiji funkce font(), respektive setFont() podobným způsobem.

Výsledný úsek kódu by tedy vypadal asi nějak takto:
Kód: [Vybrat]
QPalette     palette    = label->palette();             // Přiřazení aktuální palety
QColor       color       = QColor("#000000");         // Deklarace barvy
QFont        font        = QFont("Arial", 30, QFont::Normal, false);    // Deklarace fontu, velikost písma 30,

color.setRgb(0, 255, 0);                                    // Při opakované deklaraci je lepší použít tuto funkci, nevím proč, ale funguje...
palette.setColor(Palette::ColorGroup, Palette::ColorRole, color);     // Změna barvy pro aktivní text (neaktivní problikne při tvorbě okna
label->setPalette(palette);                                // Přiřazení změněné palety widgetu
label->setFont(font);                                        // Přiřazení fontu Arial, s velikostí 30px, normální tloušťky, bez kurzívy
label->setNum(1234);                                      // Přiřazení zobrazovaného textu, v mém případě čísla

Snad se to někomu bude hodit.

PS: Nelámejte mě v kole, pokud tam bude nějaká chybka v textu či programu, píšu to částečně z hlavy   ;D.