Как сделать QLineEdit недоступным для редактирования в Windows
Я использую Qt 5.2, и я хотел бы сделать QLineEdit
недоступным для редактирования. Проблема заключается в том, что она не похожа на нее. При использовании setReadOnly(true)
он остается на белом фоне и выглядит так, как будто он доступен для редактирования.
Если я отключу его, он станет серым, и текст также станет светлее серым. Проблема заключается в том, что нельзя копировать текст из него в отключенном состоянии.
Итак, как я могу сделать QLineEdit
правильно нередактируемым, а также сделать его похожим на него. В Windows такой элемент управления обычно серый, но текст остается черным. Конечно, я мог бы установить стиль вручную, но это означает, что он жестко закодирован и может выглядеть неправильно на других платформах.
Ответы
Ответ 1
После того, как вы редактируете строку, вы можете установить цвет фона и текста так, как вам нравится:
ui->lineEdit->setReadOnly(true);
QPalette *palette = new QPalette();
palette->setColor(QPalette::Base,Qt::gray);
palette->setColor(QPalette::Text,Qt::darkGray);
ui->lineEdit->setPalette(*palette);
Ответ 2
Поскольку Неят указал мне в правильном направлении с его ответом, вот код, который я сейчас использую:
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
Вы можете установить таблицу стилей, которая изменяет цвет объекта QLineEdit
, если для свойства readOnly
установлено значение true.
setStyleSheet("QLineEdit[readOnly=\"true\"] {"
"color: #808080;"
"background-color: #F0F0F0;"
"border: 1px solid #B0B0B0;"
"border-radius: 2px;}");
Ответ 4
У меня была та же проблема, и я сделал подкласс 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_);
}
}