大家好,我是IT文藝男,來自一線大廠的一線程序員
今天給大家講解基於C++/Qt的CQGUI框架的樣式管理實現。
在Qt平台,實現窗口/控件美化或者自定義效果,有如下兩種方式
- 重繪
- 樣式
對於重繪,我之前實現的一個效果如下圖所示::
對於樣式,我之前實現的一個效果如下圖所示::
因此,有了重繪以及樣式,就能實現高級、復雜的、優雅的UI效果;設計部有什么好的UI效果圖,程序員就能把它實現。
Qt樣式(Qt StyleSheet,QSS)
QSS的主要功能是使界面的表現與界面的元素分離,使得設計成皮膚與界面控件分離的軟件成為可能。QSS的概念、術語、語法很大程度上受到了CSS層疊樣式表的影響;由於是所見即所得方式,QSS使用很方便
樣式加載方式
- 在代碼中直接嵌入
- 通過文件加載
優先推薦使用文件加載方式,與代碼脫離
CQGUI框架樣式
- 公共樣式
- 插件樣式
一、類職責
class StyleSheetManager : public QObject
二、類方法
class StyleSheetManager : public QObject
{
Q_OBJECT
public:
explicit StyleSheetManager(QObject *parent = NULL);
void setStyleSheets(int theme, const std::string& font);
void setStylesForApp(int theme, const std::string& font);
void setStyleSheetForPlugin(const QString& plgName, int theme);
};
主要提供設置公共樣式、插件樣式的函數接口;與CQGUI框架的樣式邏輯保持一致
三、樣式文件集合
CQGUI框架的樣式文件集合如下圖所示::
四、加載公共樣式
QString apppath = QString(":/style/style%1/app.qss").arg(theme);
if (QFile::exists(apppath))
{
QFile fileapp(apppath);
if (fileapp.open(QFile::ReadOnly))
{
qss.append(fileapp.readAll().data());
qApp->setStyleSheet(qss.toUtf8());
}
}
五、加載插件樣式
QString styleSheetPath = QString(":/style/style%1/%2.qss").arg(theme).arg(plgName);
if (QFile::exists(styleSheetPath))
{
QFile file(styleSheetPath);
//獲取插件
QObject* plugin = UIGolbalManager::GetUIGolbalManager()->GetPluginInstanceQt(plgName);
if (plugin)
{
auto *plug = dynamic_cast<UIPluginInterface *>(plugin);
if (plug)
{
if (file.open(QFile::ReadOnly))
{
QString qss = QString::fromUtf8(file.readAll());
plug->setStyleSheet(qss.toUtf8());
}
}
}
}
今天就講解到這里,更詳細的代碼分析與講解,請關注微信公眾號(itwenyinan),觀看對應的的視頻版講解;謝謝