Разбирая по полочкам GUI для моего текущего проекта, столкнулся с необходимостью кастомизации самых обычных и привычных кнопочек, чекбоксов и прочих радостей жизни.
Первым вариантом, пришедшим на ум, было переопределение функций отрисовки, некая такая «классика жанра». К счастью, я вспомнил про еще одну замечательную возможность Qt — это использование StyleSheets.
Немного поколдовав над самой «очевидной» вещью — кнопкой — я получил такой результат:
Самым интересным является то, что достичь такого результата не составляет труда! QSS во многом повторяет CSS, так что он будет знаком любому, кто хоть раз касался вопросов верстки сайтов.
В нашем случае достаточно создать файл стиля следующего содержания:
QPushButton { border: 1px solid #000000; border-radius: 10px; background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #dedede, stop: 0.5 #434343, stop: 0.51 #000000, stop: 1 #656a6d); color: #FFFFFF; font: bold 14px; min-width: 80px; } QPushButton:pressed { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #cfcccc, stop: 0.5 #333232, stop: 0.51 #000000, stop: 1 #585c5f); color: #00CC00; } QPushButton:flat { border: none; }
…загрузить этот файл в приложении:
... // Setup application style QFile styleFile("data/style/default.qss"); if( styleFile.open(QFile::ReadOnly) ) { QString styleSheet = QLatin1String(styleFile.readAll()); qApp->setStyleSheet(styleSheet); } else qDebug() << "Style can't be loaded."; ...
.. и все! :)
Текст стиля можно указывать и прямо в программе, примеры вы сможете найти в документации. Да и использование QString в моем примере наглядно показывает эту возможность.
Как мне кажется, для простого «оживления» внешнего вида кнопки, выглядит неплохо:
Аналогично определяются такие состояния кнопки, как «checked», «disabled» и т.п. — все зависит от Ваших нужд и Вашей фантазии.
Очевидно, что такой подход имеет два неоспоримых преимущества — отсутствие необходимости перекомпиляции программы для применения изменений в стиле и широко известный язык верстки. Тем самым, дизайном программы может заниматься человек, далекий от программирования, при этом наблюдая изменения после простого перезапуска программы.
Автор использованной иконки: Gpopper
Comments
Спасибо большое за статью! Мне пару дней назад понадобилось аналогичное, вопрос решен.
Вот только возник вопрос… Меню в программе нужно сделать многоуровневое, как это лучше реализовать средствами Qt? Создавать кучу лайаутов не хочется… можно на одном динамически создавать кнопочки, но насколько это хорошо не уверен, может есть какой-то более правильный способ?
Всегда рад, когда что-нибудь из написанного пригождается :)
Под «многоуровневым меню» что Вы понимаете — классическое «кликнули — рядом появилось еще меню» или «нажали — раскрылось и осталось в рамках данного виджета, к примеру, со сдвигом другой информации вниз»?
Кстати, по теме QSS рекомендую ссылку: http://newsgroup.xnview.com/viewtopic.php?f=60&t=21219
Под многоуровневым примерно следующее, например.
Если рассмотреть меню приведенное в тексте статьи, там есть кнопка «еще». Например нажав на которую появится точно такое же меню но с другими названиями кнопок, а вместо кнопки «еще» кнопка назад.
Тут два пути создать еще одну формочку и вызывать её, либо поменять названия и связи на текущих кнопках… Либо может есть еще какой путь?
P.S. Кстати получилось собрать под Thumb ?
Честно говоря, в условиях wince я делал различные виджеты, лежащие в QStackWidget (с динамическим созданием, добавлением и удалением и т.п.).
В принципе, проще смотреть QML для таких вещей — там проще реализуется.
С Thumb’ом конфликтует сторонняя либа, пока неразбирался.
Кстати, как победить на WinCE появление пустого окошка с крестиком, перед тем как форма примет полноэкранный размер. Т.е. появление формы сопровождается «артефактом».