J'utilise Qt 5.2 et je voudrais faire un QLineEdit
non éditable. Le problème, c'est que cela ne semble pas être le cas. Lorsque vous utilisez setReadOnly(true)
, il reste sur un fond blanc et semble encore éditable.
Si je le désactive, il devient gris et le texte devient également plus clair. Le problème est que l’on ne peut pas en copier le texte, dans un état désactivé.
Alors, comment puis-je rendre une QLineEdit
correctement non éditable et lui donner l’aspect semblable. Sous Windows, un tel contrôle est généralement gris, mais le texte reste noir. Bien sûr, je pourrais définir le style manuellement, mais cela signifie qu'il est codé en dur et peut sembler faux sur d'autres plateformes.
Après avoir modifié la ligne en lecture seule, vous pouvez définir les couleurs d’arrière-plan et du texte comme vous le souhaitez:
ui->lineEdit->setReadOnly(true);
QPalette *palette = new QPalette();
palette->setColor(QPalette::Base,Qt::gray);
palette->setColor(QPalette::Text,Qt::darkGray);
ui->lineEdit->setPalette(*palette);
Depuis que Nejat m'a dirigé dans la bonne direction avec sa réponse, voici le code que j'utilise maintenant:
QPalette mEditable = mGUI->mPathText->palette(); // Default colors
QPalette mNonEditable = mGUI->mPathText->palette();
QColor col = mNonEditable.color(QPalette::Button);
mNonEditable.setColor(QPalette::Base, col);
mNonEditable.setColor(QPalette::Text, Qt::black);
....
void MyWidget::setEditable(bool bEditable)
{
mGUI->mPathText->setReadOnly(!bEditable);
if(bEditable)
mGUI->mPathText->setPalette(mEditable);
else
mGUI->mPathText->setPalette(mNonEditable);
}
Vous pouvez définir une feuille de style qui modifie la couleur d'un objet QLineEdit
si sa propriété readOnly
est définie sur true.
setStyleSheet("QLineEdit[readOnly=\"true\"] {"
"color: #808080;"
"background-color: #F0F0F0;"
"border: 1px solid #B0B0B0;"
"border-radius: 2px;}");
J'ai eu le même problème et fait une sous-classe QLineView
dérivée de QLineEdit
. Ensuite, j'ai réimplémenté void setReadOnly(bool)
et ajouté un membre var QPalette activePalette_
Stockez la palette QLineEdit
s dans le ctor.
Ma méthode réimplémentée ressemble à ceci
void QLineView::setReadOnly( bool state ) {
QLineEdit::setReadOnly(state);
if (state) {
QPalette pal = this->activePalette_;
QColor color = pal.color(QPalette::disabled, this->backgroundRole());
pal.setColor(QPalette::Active, this->backgroundRole(), color);
pal.setColor(QPalette::InActive, this->backgroundRole(), color);
this->setPalette(pal);
}
else {
this->setPalette(this->activePalette_);
}
}