web-dev-qa-db-fra.com

Comment rendre un QLineEdit non éditable dans Windows

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.

19
Devolus

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);
16
Nejat

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);
}
4
Devolus

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;}");
1
thuga

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 QLineEdits 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_);
    }
}
1
Kai Walz