QTextEdit disabled, trotzdem Scollbar

Alles rund um die Programmierung mit Qt
Antworten
suamikim
Beiträge: 59
Registriert: 1. November 2009 15:58

QTextEdit disabled, trotzdem Scollbar

Beitrag 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
drizzt
Beiträge: 29
Registriert: 9. Oktober 2009 13:37

Beitrag 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 :-)
suamikim
Beiträge: 59
Registriert: 1. November 2009 15:58

Beitrag 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
FaS
Beiträge: 184
Registriert: 25. Mai 2006 19:48
Kontaktdaten:

Beitrag 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
suamikim
Beiträge: 59
Registriert: 1. November 2009 15:58

Beitrag 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
FaS
Beiträge: 184
Registriert: 25. Mai 2006 19:48
Kontaktdaten:

Beitrag 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
Antworten