Как сделать QLineEdit недоступным для редактирования в Windows

Я использую Qt 5.2, и я хотел бы сделать QLineEdit не редактируется Проблема в том, что это не так. Когда используешь setReadOnly(true) он остается на белом фоне и выглядит как редактируемый.

Если я отключу его, то он станет серым, и текст также станет светло-серым. Проблема в том, что нельзя скопировать текст с него в отключенном состоянии.

Так как я могу сделать QLineEdit должным образом не редактируемый, а также сделать его похожим на это. В Windows такой элемент управления обычно серый, но текст остается черным. Конечно, я мог бы установить стиль вручную, но это означает, что он жестко запрограммирован и может выглядеть неправильно на других платформах.

18

Решение

После редактирования строки только для чтения, вы можете установить цвет фона и текста на ваш вкус:

ui->lineEdit->setReadOnly(true);

QPalette *palette = new QPalette();
palette->setColor(QPalette::Base,Qt::gray);
palette->setColor(QPalette::Text,Qt::darkGray);
ui->lineEdit->setPalette(*palette);
15

Другие решения

Поскольку Неджат указал мне правильный ответ, вот код, который я сейчас использую:

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);
}
3

У меня была такая же проблема и сделал подкласс QLineView происходит от QLineEdit, Затем я переопределил void setReadOnly(bool) и добавил член var QPalette activePalette_

Хранить QLineEditпалитра в ctor.

Мой переопределенный метод Lokks, как это

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

Вы можете установить таблицу стилей, которая меняет цвет QLineEdit объект, если его readOnly свойство имеет значение true.

setStyleSheet("QLineEdit[readOnly=\"true\"] {""color: #808080;""background-color: #F0F0F0;""border: 1px solid #B0B0B0;""border-radius: 2px;}");
1
По вопросам рекламы [email protected]