Qt资源系统(Qt Resource System)是一种将图片、数据存储在二进制文件中的一套系统。一般我们在程序中调用一张图片或者一个图标字体作为某个按钮的图标,如果替换成另一张同名的图片,那么程序运行时会加载新的图标。有这么一种情况,开发者不希望这些图标被修改或图标文件丢了程序界面也就不能正常显示。
我们可以把这些图片存储在可执行文件中,即使删除了文件夹中的图标也不会影响界面图标的加载,因为图标数据已经以静态数据的方式保存在可执行文件中了。当然,代价就是编译出的可执行文件容量会增加,克服这个缺点的方法就是动态加载资源。
在新建文件中选择Qt Resource File,配置路径的时候最好在项目根目录下新建一个文件夹专门存放resource相关的文件。
创建完成后,我们可以在项目中看到已经有了一个Resouces文件夹,注意这个文件夹是系统自动生成的,不是我们手动生成的。
在Resources目录下有一个Resources\Resources.qrc
文件,这个文件才是我们刚才新建的,并且在根目录下的Resources文件夹下。我们新建的Resources文件夹只是碰巧与项目中的Resources目录名称一样,当然,你也可以使用其他名称。
我们创建了qrc文件后,可以检查pro文件,会发现多了一个句话:
RESOURCES += \
Resources/Resources.qrc
这是一个静态加载方式,默认情况下就是这种方式,是直接将资源数据存储在可执行文件中。
另外一种方式的动态加载方式,是将资源数据存储在单独的二进制文件中并由可执行文件调用。这种方式需要手动用rcc工具编译qrc文件,然后用QResource类加载,这里就不举例了。
进入资源编辑器后,首先需要添加一个前缀,这个东西其实就和目录差不多的,本质就是分组。如下图,我们已经分了3个组。
然后我们给每个组Add Files。
我们也可以使用普通文本编辑器打开qrc文件,发现其实就是xml文件。
static void loadStyle(e)
{
QFile file(":/style/Style/blacksoft.css");
if (file.open(QFile::ReadOnly)) {
QString qss = QLatin1String(file.readAll());
QString paletteColor = qss.mid(20, 7);
qApp->setPalette(QPalette(paletteColor));
qApp->setStyleSheet(qss);
file.close();
}
}
static void loadFont()
{
QFont iconFont;
QFontDatabase fontDb;
if(fontDb.hasFamily("FontAwesome"))
{
iconFont=QFont("FontAwesome");
}
else
{
int fontId = fontDb.addApplicationFont(":/font/Font/fontawesome-webfont.ttf");
QStringList fontName = fontDb.applicationFontFamilies(fontId);
if (fontName.count() == 0) {
qDebug("load fontawesome-webfont.ttf error");
}
}
iconFont=QFont("FontAwesome");
qApp->setFont(iconFont);
}
上述两个代码分别设置了style和font,其中资源的路径可以通过下图方式直接获取:
使用Path和URL都是可以的。
关于字体图标的使用,这里多写几句。一般的除了ttf文件,还会有一个图形字体(Unicode)对照表,我们将widget的文本设置为Unicode就可以看到它的图形。
connectPB=new QPushButton(QChar(0xf0f9));