Seite 1 von 1

QTextEdit disabled, trotzdem Scollbar

Verfasst: 3. März 2010 17:06
von suamikim
Hallo zusammen,

ich hab ein QTextEdit, welches ich entweder disabled oder readonly darstellen will. Es darf jedenfalls nicht editierbar sein.

Leider haben beide Varianten einen Nachteil:

Disabled:
Tlw. ist das Text-Edit für den dargstellten Text zu niedrig, dh. ich bräuchte eine vertikale Scrollbar. Diese kann ich auch anzeigen lassen indem ich die Eigenschaft "verticalScrollbarPolicy" auf "ScrollBarAlwaysOn" schalte. Nur ist sie so zwar sichtbar, aber nicht benutzbar (der Benutzer kann also erst wieder nicht scrollen)...

Read-Only:
Vom verhalten her ist hier alles richtig, allerdings gefällt mir nicht, dass man optisch keinen unterschied zum "nicht-Read-Only"-TextEdit sieht.
Dh. ich hätte den Hintergrund des TextEdit im Read-Only-Modus gerne grau (genau so, als wäre es disabled).

Mittels Style-Sheet könnte ich nun natürlich die Background-Color setzen:

Code: Alles auswählen

m_ui->textEdit->setStyleSheet("background-color: rgb(209, 209, 209)");
Dabei hab ich aber das Problem, dass ich die Anwendung auf mehreren Plattformen laufen lassen möchte (aktuell Win & Ubuntu) und die farbe daher nicht fix sein sollte, sondern dem "nativen" Betriebssystem-Stil entsprechen sollte.

Gibt es eine Möglichkeit hier die Systemfarbe für Fenster, die disabled sind anzugeben?

danke, mfg

Verfasst: 3. März 2010 17:27
von drizzt
ich weiß nicht genau, ob das geht, weil ich es noch nie versucht habe,
aber vielleicht kann man iwo die ColorGroup der Palette setzen...
auf:
z.B. textEdit->palette().setColorGroup(QPalette::Disabled)

habs aber wie gesagt noch nie ausprobiert :-)

Verfasst: 3. März 2010 18:00
von suamikim
Hm, das hört sich ja vielversprechend an. Nur leider wird die Palette bei mir nicht richtig gesetzt:

Code: Alles auswählen

QPalette pal = m_ui->teAnswer->palette();
pal.setCurrentColorGroup(QPalette::Disabled);
m_ui->teAnswer->setPalette(pal);

qDebug() << m_ui->teAnswer->palette().currentColorGroup();
qDebug() << pal.currentColorGroup();
Das erste qDebug liefert 0 (QPalette::Active), dass zweite 1 (QPalette::Disabled)...

Jemand einen Rat, warum das setPalette anscheinend nicht funktioniert?
Muss beim Widget bzw. dem QTextEdit zuvor vielleicht irgendeine Eigenschaft gesetzt werden, damit die Palette übernommen wird?

StyleSheets benutze ich jedenfalls nicht. Hab in der Doku irgendwo gelesen, dass man individuelle Paletten und StyleSheets nicht gemeinsam benutzen soll...

danke, mfg

Verfasst: 3. März 2010 19:03
von FaS
Ich mache das immer so:

Code: Alles auswählen

    QPalette p = m_ui->teAnswer->palette();
    p.setBrush( QPalette::Active, QPalette::Base, p.brush( QPalette::Normal, QPalette::Window ) );
    p.setBrush( QPalette::Inactive, QPalette::Base, p.brush( QPalette::Normal, QPalette::Window ) );

    m_ui->teAnswer->setPalette( p );
Gruß,
FaS

Verfasst: 4. März 2010 09:32
von suamikim
FaS hat geschrieben:Ich mache das immer so:

Code: Alles auswählen

    QPalette p = m_ui->teAnswer->palette();
    p.setBrush( QPalette::Active, QPalette::Base, p.brush( QPalette::Normal, QPalette::Window ) );
    p.setBrush( QPalette::Inactive, QPalette::Base, p.brush( QPalette::Normal, QPalette::Window ) );

    m_ui->teAnswer->setPalette( p );
Ok, das funktioniert nun genauso, wie ich es wollte! Danke dafür!

Mich würde trotzdem noch interessieren, warum mein 1. Versuch mittels setCurrentColorGroup gescheitert ist? Falls jemand eine Ahnung hat würde ich mich über eine Antwort freuen!

danke, mfg

Verfasst: 9. März 2010 14:53
von FaS
Naja du gehst davon aus, dass sich ein Widget mit Hilfe der Farbpalette immer in derselben colorGroup styled. Aber es muss doch je nach Status anders aussehen! Laut Doku liefern color() und Konsorten ohne die Übergabe einer spezifischen Color-Group die Farben für die _aktuelle_ Color-Group, und genau dafür ist setCurrentColorGroup zuständig: Um im Code nicht ständig die aktuelle Gruppe durchschleifen zu müssen.
Und da Widgets bestimmt nicht zufällig aussehen wollen, müssen sie entweder bei Palettenabfragen ihren aktuellen Status als ColorGroup übermitteln (was die currentColorGroup überlädt) oder eben bei Statuswechseln (und logischerweise bei Palettenwechseln zur Initialisierung der Palette) die aktuelle ColorGroup setzen und damit die von dir gesetzte überschreiben, so dass ihr Aussehen eben zur Situation passt.

Gruß,
FaS