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

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

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

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

4 ответов


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

ui->lineEdit->setReadOnly(true);

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

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

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

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

сохранить QLineEdits палитра в 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_);
    }
}

вы можете установить таблицу стилей, которая изменяет цвет