Как сделать 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_);
    }
}