c++ - example - qtextedit
Cómo hacer que un QLineEdit no sea editable en Windows (4)
Como Nejat me indicó la dirección correcta con su respuesta, aquí está el código que ahora uso:
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);
}
Estoy usando Qt 5.2 y me gustaría hacer un QLineEdit
no editable. El problema con esto es que no lo parece. Cuando se usa setReadOnly(true)
se mantiene con un fondo blanco y parece que todavía es editable.
Si lo inhabilito, se vuelve gris y el texto también se vuelve un gris más claro. El problema es que uno no puede copiar el texto desde él, en un estado deshabilitado.
Entonces, ¿cómo puedo hacer un QLineEdit
correctamente no editable y también hacer que se vea como él? En Windows, tal control suele ser gris, pero el texto permanece en negro. Por supuesto, podría establecer el estilo manualmente, pero esto significa que está codificado y puede parecer mal en otras plataformas.
Después de hacer que la línea se edite solo, puede configurar los colores de fondo y de texto como desee:
ui->lineEdit->setReadOnly(true);
QPalette *palette = new QPalette();
palette->setColor(QPalette::Base,Qt::gray);
palette->setColor(QPalette::Text,Qt::darkGray);
ui->lineEdit->setPalette(*palette);
Podría establecer una hoja de estilo que cambie el color de un objeto QLineEdit
, si su propiedad readOnly
se establece en true.
setStyleSheet("QLineEdit[readOnly=/"true/"] {"
"color: #808080;"
"background-color: #F0F0F0;"
"border: 1px solid #B0B0B0;"
"border-radius: 2px;}");
Tuve el mismo problema e hice una subclase QLineView
derivada de QLineEdit
. Luego, reimplementé void setReadOnly(bool)
y agregué un miembro var QPalette activePalette_
Almacena la paleta de QLineEdit
dentro del ctor.
Mi método reimplementado lokks como este
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_);
}
}