В своей практике постоянно сталкивался с задачей отладить файл стиля в реальном проекте. Если для веб-приложений достаточно нажать F5 в браузере, то на десктопе придется перезапускать приложение, иногда авторизовываться, добираться до нужной формы. Это большая потеря времени. Попробуем сделать инструмент для удобной отладки стилей. Сформулирую пользовательский сценарий:
Хотим править файл стиля и сразу смотреть как это выглядит в любой форме приложения.
Приступая к реализации, будем считать, что пользователя устроит вариант сохранить файлстиля — нажать кнопку обновления в приложении. Реализация будет опирация на механизм перехвата событий приложения (eventFilter). При старте приложения установим перехватчик событий, который будет перезагружать файл стиля при нажатии заданной клавиши.
Немного кода:
#ifndef STYLELOADER_H #define STYLELOADER_H #include <QObject> #include <QKeySequence> class StyleLoader: public QObject { Q_OBJECT public: static void attach(const QString& filename = defaultStyleFile(), QKeySequence key = QKeySequence("F5")); bool eventFilter(QObject *obj, QEvent *event); private: StyleLoader(QObject * parent, const QString& filename, const QKeySequence& key); void setAppStyleSheet(); static QString defaultStyleFile(); QString m_filename; QKeySequence m_key; }; #endif // STYLELOADER_H
#include "StyleLoader.h" #include <QApplication> #include <QFile> #include <QKeyEvent> #include <QDebug> void StyleLoader::attach(const QString &filename, QKeySequence key) { StyleLoader * loader = new StyleLoader(qApp, filename, key); qApp->installEventFilter(loader); loader->setAppStyleSheet(); } bool StyleLoader::eventFilter(QObject *obj, QEvent *event) { if (event->type() == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event); if(m_key == QKeySequence(keyEvent->key())) setAppStyleSheet(); return true; } else return QObject::eventFilter(obj, event); } void StyleLoader::setAppStyleSheet() { QFile file(m_filename); if(!file.open(QIODevice::ReadOnly)) { qDebug() << "Cannot open stylesheet file " << m_filename; return; } QString stylesheet = QString::fromUtf8(file.readAll()); qApp->setStyleSheet(stylesheet); } QString StyleLoader::defaultStyleFile() { return QApplication::applicationDirPath() + "/style.qss"; } StyleLoader::StyleLoader(QObject *parent, const QString& filename, const QKeySequence &key): QObject(parent), m_filename(filename), m_key(key) { }
Чтобы подключить инструмент к приложению, достаточно написать одну строчку где-нибудь в main():
StyleLoader::attach();
В таком варианте будут использоваться настройки по-умолчанию:
файл стиля: Папка_с_исполняемым файлом/style.qss
Клавиша для обновления: F5
.
Можно задать собственные значения:
StyleLoader::attach("c:/myStyle.qss", QKeySequence("F6"));
Теперь мы можем запустить наше приложение, в любой момент подправить файл стиля, нажать F5 и сразу же увидеть как это будет выглядеть.
PS: код компактный, поэтому рекомендую просто стащить себе в проект. Вскоре выложу на Github под свободной лицензией.
ссылка на оригинал статьи http://habrahabr.ru/post/232323/
Добавить комментарий