QTextEdit : rafraichissement d'une zone sélectionnée
Bonjour,
je dispose d'un TEditText sur ma MainWindow
Code:
1 2 3 4 5 6 7 8
| MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->te->setHtml("Voici un <a href='http://#'>lien</a>. Il ne mène nulle part...");
ui->te->setFocus();
} |
J'utilise un QPushButton pour mettre la seléction choisie en gras:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| void MainWindow::on_btBOLD_clicked()
{ QTextCursor cs = ui->te->textCursor();
if(!cs.hasSelection()) {return;}
QTextCharFormat cf = cs.charFormat();
cf.setFontWeight(QFont::Bold);
cs.mergeCharFormat(cf);
// ui->te->mergeCurrentCharFormat(cf);
//Déselection et replacement curseur
cs.clearSelection();
ui->te->setTextCursor(cs);
ui->te->setFocus();
} |
C'est opérationnel mais j'aurais aimé me rapprocher d'une ergonomie Libre Office.
En LibreOffice : On sélectione la zone, on clique et dans la zone toujours sélectionnée, le résultat est affiché.
http://www.selzig.com/1405291900/5.png
En Qt : Mêmes actions. Le fait de sélectionner la zone modifie la couleur du texte. Après l'action du bouton, la zone est sélectionnée (en gris clair) et le texte n'est pas actualisé avec son formatage complet : le gras est bien affiché mais pas les couleurs d'origine. Pour rendre l'effet totalement visible, il faut désélectionner la zone (en cliquant par exemple dans le QTexEdit) ou par programmation. C'est ce que j'ai retenu finalement... et cela convient très bien pour l'usage dont j'ai besoin.
http://www.selzig.com/1405291900/1.png
Mais comme j'essaie de développer mes connaissances en Qt, par quelle approche peut-on obtenir l'ergonomie de Libre Office ?
Mon approche "lazarusienne" m'inciterait à procéder ainsi : pour éviter le highlight, on peut facilement modifier la palette de la zone sélectionnée mais cela ne n'empêchera pas la mise en "mono-color" (en blanc par défaut) du texte au moment de la sélection.
Code:
1 2 3
| QPalette pa = ui->te->palette();
pa.setColor(QPalette::Highlight, Qt::transparent); //ou autre chose (une nuance de bleu)
ui->te->setPalette(pa) |
donc il faudrait mémoriser également la couleur de chaque caractère (groupe de caractères ?) avant d'intercepter la sélection, la mémoriser... et la "restituer" (i.e. un faux semblant de la sélection ?) après l'action du bouton. Est-ce envisageable ou existe-t-il une méthode plus simple ?
Merci. Cordialement. Gilles
Qt 5.3 - Win7 32 et 64.