Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Гурман от Июнь 25, 2015, 14:04



Название: Фон QLineEdit
Отправлено: Гурман от Июнь 25, 2015, 14:04
Захотелось на досуге раскрасить ввод текстовых строк. Благодаря известному трудно объяснимому глюку, фон редактора строки QLineEdit не изменяется при задании palette.setColor(QPalette::Base, <код цвета>); widget.setPalette(palette);. При этом у других виджетов-редакторов, включая аналогичные по сути редакторы вещественных и целых чисел, и даже комбо-бокс с редактированием - волшебным образом меняется. Вызов widget.setAutoFillBackground(true); не помогает. Вариант с заданием фиксированного стиля не подходит - слишком муторно, у меня этот параметр задается пользователем в настройках, а цвет пользователь выбирает с помощью QColorDialog. И хранится он в QVariant::Color. То есть, у меня есть значение QColor. Формировать по нему строку для стиля - фигня получится. Может кто знает какой-нибудь обходной путь?


Название: Re: Фон QLineEdit
Отправлено: sociopath от Июнь 25, 2015, 14:35
А у вас какие ОС/компилятор/Qt?
У меня под win7/mingw все работает корректно и на qt486, и на qt531


Название: Re: Фон QLineEdit
Отправлено: GreatSnake от Июнь 25, 2015, 14:40
palette.setColor(QPalette::Base, <код цвета>); widget.setPalette(palette);
Тоже всё работает. Может проблема в "<код цвета>"?


Название: Re: Фон QLineEdit
Отправлено: Гурман от Июнь 25, 2015, 19:11
А у вас какие ОС/компилятор/Qt?
У меня под win7/mingw все работает корректно и на qt486, и на qt531

XP SP3, Qt 4.7, MinGW из комплекта. Переходить на другие нельзя - проект в стадии завершения. Буду скоро собирать в Linux, там тоже буду посмотреть.

Жалобы на этот глюк я в Сети нашел многократные (https://www.google.ru/search?q=qlineedit+background+color). Везде предлагают использовать стили, но мне это не годится, по указанным причинам.

palette.setColor(QPalette::Base, <код цвета>); widget.setPalette(palette);
Тоже всё работает. Может проблема в "<код цвета>"?

Точно нет.

Код:
void WControl::hasColors(SettingsList *settings)
{
    QPalette p = palette();
    p.setColor( QPalette::Text, makeSetting(settings,"foreground",QColor(Qt::black),
                            QVariant::Color, tr(".Цвет текста")).value<QColor>() );
    p.setColor( QPalette::Base, makeSetting(settings,"background",QColor(Qt::white),
                            QVariant::Color, tr(".Цвет фона")).value<QColor>() );
    setPalette(p);
}

Эта функция вызывается в настройках всех виджетов, которые имеют текст, который можно раскрасить. У тех WControl, которые наследуют QSpinBox, QComboBox, QDoubleSpinBox, QPlainTextEdit - всё работает как надо. И только один наследник QLineEdit получился как дурак с семью битами.


Название: Re: Фон QLineEdit
Отправлено: sociopath от Июнь 25, 2015, 21:15
По вашей ссылке нашел только 1 топик на лоре, в котором у человека действительно не отрисовывался нормально фон, но только при setFrame(false). В остальных топиках разные рукожопы не могли прикрутить qss. То есть проблема не в qt. Проверьте еще раз, что возвращает функция makeSetting. Если возвращает корректное значение, то сделать через qss можно в 2 строки:
Код:
QColor c = makeSetting(...);
setStyleSheet(QString("QLineEdit { background: rgb(%1, %2, %3); }").arg(c.red()).arg(c.green()).arg(c.blue()));
Не вижу, что тут такого муторного.


Название: Re: Фон QLineEdit
Отправлено: Гурман от Июнь 25, 2015, 21:39
По вашей ссылке нашел только 1 топик на лоре, в котором у человека действительно не отрисовывался нормально фон, но только при setFrame(false). В остальных топиках разные рукожопы не могли прикрутить qss. То есть проблема не в qt. Проверьте еще раз, что возвращает функция makeSetting. Если возвращает корректное значение, то сделать через qss можно в 2 строки:
Код:
QColor c = makeSetting(...);
setStyleSheet(QString("QLineEdit { background: rgb(%1, %2, %3); }").arg(c.red()).arg(c.green()).arg(c.blue()));
Не вижу, что тут такого муторного.

Функция makeSetting возвращает то, что должна, используется с 2011 года и проверена на 100500%. В приведенном коде перед установкой цвета background идентично устанавливается цвет foreground, и это идеально срабатывает у QLineEdit. При наличии setPalette() установка с помощью стиля - это то, что называется "через ж...". То есть, проблема именно в Qt. Муторность возникает из-за того, что разные виджеты у меня все являются классом WControl, но для выполнения одинакового с другими действия в одном из них приходится мостырыть отдельный код. Хотя должно работать и без этого. В QSpinBox устанавливаются оба цвета, а в QLineEdit про background забыли... Возможно, в более новых версиях Qt это уже и поправлено, значит муторность от использования стилей увеличивается - надо будет не забыть при переходе на новый Qt заменить обратно на использование палитры.

Да, кстати - а разве стиль таким макаром устанавливается не для всех QLineEdit?? Вроде бы для всех должен. Сейчас проверю, но если будет на все влиять, то этот вариант не приемлем. Нужно устанавливать цвета для каждого QLineEdit индивидуально. А сколько их будет - я не знаю, это пользователь будет решать, какой интерфейс он нарисует и сколько виджетов на нём будет.


Название: Re: Фон QLineEdit
Отправлено: Гурман от Июнь 25, 2015, 22:08
Не работает установка стилем... Я на 99.99% уверен, что интерпретатор стиля внутри использует точно такой же вызов setPalette(), а он с дыркой.


Название: Re: Фон QLineEdit
Отправлено: sociopath от Июнь 26, 2015, 03:07
У вас QLineEdit - это редактор ячейки в QAbstractItemView? Если да, то надо стиль тогда делать "QAbstractItemView QLineEdit { background: rgb(%1, %2, %3); }"


Название: Re: Фон QLineEdit
Отправлено: Гурман от Июнь 28, 2015, 00:50
Нет, у меня это просто виджет на QMainWindow


Название: Re: Фон QLineEdit
Отправлено: sociopath от Июнь 28, 2015, 15:24
Есть подозрение, что проблема в QWindowsXpStyle. Там как раз функция drawPrimitive в части PE_FrameLineEdit изменилась с 4.7.0 до 4.8.6. У меня есть машина с xp, на 4.8.6 все работает нормально. QPalette и функция setPalette в QWidget не менялись на этом диапазоне версий.

У вас какая конкретно версия Qt? QT_MAJOR_VERSION 4, QT_MINOR_VERSION 7, а QT_PATCH_VERSION какая? Хочу на xp машину поставить, посмотреть как работать будет и исправить по возможности. Но вообще если ошибка действительно окажется в QWindowsXpStyle, то Qt придется собирать с флагами -qt-style-windows и -qt-style-windowsxp, по умолчанию инклюды "QWindowsStyle" и "QWindowsXpStyle" недоступны для включения.


Название: Re: Фон QLineEdit
Отправлено: Гурман от Июнь 28, 2015, 22:28
Qt 4.7.0


Название: Re: Фон QLineEdit
Отправлено: Igors от Июнь 29, 2015, 11:29
Qt 4.7.0
Qt 5.4.2 - работает setPalette (OSX + Win). Расплата за нежелание обновляться