Russian Qt Forum
Ноябрь 23, 2024, 06:10 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Фон QLineEdit  (Прочитано 7833 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Июнь 25, 2015, 14:04 »

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

2^7-1 == 127, задумайтесь...
sociopath
Гость
« Ответ #1 : Июнь 25, 2015, 14:35 »

А у вас какие ОС/компилятор/Qt?
У меня под win7/mingw все работает корректно и на qt486, и на qt531
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #2 : Июнь 25, 2015, 14:40 »

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

Qt 5.11/4.8.7 (X11/Win)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #3 : Июнь 25, 2015, 19:11 »

А у вас какие ОС/компилятор/Qt?
У меня под win7/mingw все работает корректно и на qt486, и на qt531

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

Жалобы на этот глюк я в Сети нашел многократные. Везде предлагают использовать стили, но мне это не годится, по указанным причинам.

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 получился как дурак с семью битами.
« Последнее редактирование: Июнь 25, 2015, 19:37 от Гурман » Записан

2^7-1 == 127, задумайтесь...
sociopath
Гость
« Ответ #4 : Июнь 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()));
Не вижу, что тут такого муторного.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #5 : Июнь 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 индивидуально. А сколько их будет - я не знаю, это пользователь будет решать, какой интерфейс он нарисует и сколько виджетов на нём будет.
« Последнее редактирование: Июнь 25, 2015, 21:55 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #6 : Июнь 25, 2015, 22:08 »

Не работает установка стилем... Я на 99.99% уверен, что интерпретатор стиля внутри использует точно такой же вызов setPalette(), а он с дыркой.
Записан

2^7-1 == 127, задумайтесь...
sociopath
Гость
« Ответ #7 : Июнь 26, 2015, 03:07 »

У вас QLineEdit - это редактор ячейки в QAbstractItemView? Если да, то надо стиль тогда делать "QAbstractItemView QLineEdit { background: rgb(%1, %2, %3); }"
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #8 : Июнь 28, 2015, 00:50 »

Нет, у меня это просто виджет на QMainWindow
Записан

2^7-1 == 127, задумайтесь...
sociopath
Гость
« Ответ #9 : Июнь 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" недоступны для включения.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #10 : Июнь 28, 2015, 22:28 »

Qt 4.7.0
« Последнее редактирование: Июнь 28, 2015, 22:31 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Июнь 29, 2015, 11:29 »

Qt 4.7.0
Qt 5.4.2 - работает setPalette (OSX + Win). Расплата за нежелание обновляться
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.128 секунд. Запросов: 23.