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

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

setStyleSheet("QLineEdit[readOnly=\"true\"] {"
              "color: #808080;"
              "background-color: #F0F0F0;"
              "border: 1px solid #B0B0B0;"
              "border-radius: 2px;}");

У меня была такая же проблема и сделал подкласс 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_);
    }
}
Другие вопросы по тегам