Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: noname 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!
-
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:
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.