2015-08-19 7 views
5

Есть ли способ изменить цвет фона виджета без потери его стиля? Моя проблема воспроизводится в Windows 7/Vista с темой Aero и в Windows 8. Вы можете увидеть, как это выглядит в Qt Designer:Как сохранить тему Windows Aero после установки цвета фона кнопки в Qt?

Background colour is the only difference between top and bottom buttons

Здесь мы имеем четыре кнопки: оба топ виджеты хорошо выглядят (как и все другие виджеты этой программы), но оба нижних виджеты выглядят старым. Единственной причиной этого старого стиля является установка цвета фона этих кнопок (насколько я понимаю, Desktop Window Manager сбрасывает стиль в старый, если виджет не является стандартным).

Итак, есть ли способ заставить Desktop Window Manager нарисовать кнопку с нестандартным цветом фона? (Microsoft Office может это сделать, но я не уверен, что это стандартная функция)

Не могли бы вы порекомендовать расширение Qt, которое заменяет стандартный рисунок кнопок современной (тема Aero)? Или, может быть, вы знаете более стандартный способ сделать это?

Я нашел только один способ изменить цвет без потери стиля: нанести частично прозрачный виджет над кнопкой (и сделать его прозрачным для щелчков мыши). Вы можете увидеть результат здесь (мой кадр больше, чем необходимо - это для демонстрации, и мне нужна цветокоррекция для компенсации прозрачности, но это не критично):

Workaround (semi-transparent frame is above buttons)

Он работает, но Мне не нравится это «решение». У вас есть идея?

+1

К сожалению, [Windows изначально не поддерживает, что] (http://stackoverflow.com/q/18745447/1329652), поэтому все, что решение, которое вы придумаете должен быть свой собственный. Лучшее, что вы можете сделать, это нарисовать кнопку на изображении/pixmap, а затем раскрасить ее по своему желанию. –

ответ

1

Итак, есть ли способ заставить Desktop Window Manager нарисовать кнопку с не стандартным цветом фона? (Microsoft Office может это сделать, но я не уверен, что это стандартная функция)

Вы можете написать свой собственный QProxyStyle и использовать функции WinAPI сделать кнопки в стиле аэро и цвет фона на заказ. Вы можете посмотреть источники Qt, чтобы узнать, как это делается для aero. Но это очень сложная задача.

Таблицы стилей не предназначены для использования с любыми анимациями (например, анимация зависания в аэрообвесе).

Не могли бы вы рекомендовать удлинение Qt, которое заменяет стандартный рисунок кнопок современными (тема Aero)? Или, может быть, вы знаете более стандартный способ , чтобы сделать это?

Нет стандартного способа. Если вы хотите использовать таблицы стилей без таких непредсказуемых проблем - вам нужно использовать стиль «Fusion» вместо любых родных стилей. Стиль «Fusion» является хорошей базой для настройки QSS. See documentation

Другой шанс - использовать QtQuick вместо виджетов.

+0

Спасибо за эти идеи и ссылки! К сожалению, стиль «Fusion» и тема Aero в Windows разные. Не могли бы вы объяснить, как «QtQuick» может помочь здесь? – Ilya

+0

'QtQuick' - это новая часть структуры Qt, созданная для современного кросс-платформенного графического интерфейса. Вы можете прочитать документацию Qt и образцы. –

2

Я вижу, что вы используете таблицы стилей, чтобы изменить цвет фона кнопок. Некоторое время назад я столкнулся с такой же проблемой. Как только вы примените таблицу стилей, кнопка теряет 3-й эффект, и вы также не видите эффект зависания. Моей целью было отказаться от использования таблиц стилей и использовать QPalette для установки цветов.Например,

QPalette bluePalette(button->palette()); // original palette 
bluePalette.setColor(QPalette::Button, QColor(Qt::blue)); //colour you want 
button->setPalette(bluePalette); 
+1

Спасибо за эту идею! К сожалению, стиль Aero «более мощный», чем «setPalette()». Я также проверил эту идею раньше: в классической теме у нас есть синяя кнопка, но в теме Aero мы видим только кнопку с цветом фона по умолчанию. Похоже, что Desktop Window Manager просто игнорирует палитру виджета. – Ilya