废话

Qt开发总结这一part又有点半途而废的意思了。我只能说人在江湖,身不由己。毕竟要为了生活奔波,有些自己喜欢的事就得退居二线。话说我还是挺喜欢总结和分享的,或许某一天有什么机会,我可以去做个教代码的老师,想想而已。

这篇笔记想着把最近在开发过程中的遇到的一些新的认识总结一下,关于Qt的资源系统。之前我写Qt的风格是完全用代码写界面,控件和布局都是一个个new出来,但是在实际开发中,还是有人喜欢用QDesigner设计,这无可厚非。另外,美化这方面,大家都喜欢用qss,不管是在QDesigner中设置还是在代码中写,原理都是一样的。在新建Qt工程的时候一定会看见一个qrc文件,或许很长时间你并不清楚它的作用,今天我要说是关于Qt qrc文件相关原理和作用。

概述

Qt 的资源系统用于存储应用程序的可执行二进制文件,它采用平台无关的机制。当你的程序总需要这样的一系列文件(图标、翻译文件甚至是数据文件等)并且不想冒丢失某些文件的风险时,这就显得十分有用。资源系统基于 qmake、rcc(Qt 资源编译器) 和 QFile 之间的紧密合作。

qrc文件

qrc文件被称作资源集合文件。与程序相关的资源在被指定在一个 .qrc 文件中,其基于 XML 的文件格式列出了磁盘上的文件,可以为它们指定一个应用程序访问资源时必须使用的资源名称。下面给出一个示例:

<RCC>
    <qresource prefix="/images">
        <file>resource/image/background.png</file>
        <file>resource/image/setup_hover.png</file>
        <file>resource/image/play_hover.png</file>
        <file>resource/image/play_normal.png</file>
        <file>resource/image/setupbg_normal.png</file>
        <file>resource/image/work_hover.png</file>
        <file>resource/image/workbg_normal.png</file>
    </qresource>
</RCC>

值得注意的地方是,资源文件需要与qrc文件位于同一目录下或者在该目录的子目录中。另外,如果qrc文件中使用了前缀(例如<qresource prefix="/images">),使用Qt designer添加图标文件是就是自动使用前缀/new/prefix的,但是该路径默认不存在。另外,程序可以使用与代码树中相同的名字访问资源,需要带有 “:/” 前缀,或者有qrc scheme的URL。

例如: :/imagesresource/image/background.png或者URL qrc:///images/resource/image/background.png 都可以访问在程序代码树中的background.png文件。用文件标签的别名属性可以改变访问名称:

<file alias="background.png">resource/image/background.png</file>

之后,在程序中就可以使用 :/background.png 访问此文件了。

该文件可以用VS 或是文本编辑器编辑(比较方便),也可以用QtDesigner设计(个人觉得不怎么好用)。

Qt开发总结(12)——资源系统

Qt开发总结(12)——资源系统

Qt开发总结(12)——资源系统

 

 

编译

要把一个资源编译到二进制文件中, 必须在 .pro 中明确指定.qrc 文件,以便于 qmake 可以正确处理。例如:

RESOURCES = application.qrc

如果是VS系列,则需要在Resoures标签下添加该 application.qrc文件。

qmake 会产生 make 规则(rcc)来生成一个链接到程序中的名为 qrc_application.cpp 的文件,该文件默认在GeneratedFiles文件夹下可以看到。这个文件以静态的 C++ 压缩二进制数组包含了所有图片和其它资源的数据。当 qrc_application.cpp 本身或者是其引用的资源文件发生改变后,该文件都会被自动重新生成。默认情况下,编译成功的资源是被压缩的(ZIP 格式),因此你的exe文件并不会很大。

使用

在VS或Qt Creator中用于源码是,只要按照上述方式的prefix(非必须)加文件路径的方式访问资源文件。在QtDesigner中,选择某一控件,需要在StyleSheet中添加资源,然后选择该qrc文件,即可看到所有资源。你可以选择相应的选项添加样式表。

Qt开发总结(12)——资源系统

 

问题

这里特别提一个问题,不论是在源码中通过setStyleSheet还是想上述方法在QtDesigner中设置样式表,请不要为父窗口设置背景图片。该函数只能用于设置有父窗口的子窗口的背景!如果一个窗口没有子窗口,则无法使用该函数来设置背景颜色或图片!!
对于一个父窗口而言:如果我们用setStyleShette设置了其样式,而对于其子窗口:如果没有用同样的函数来设置的话, 则其子窗口的样式和其父窗口完全一致,亦即:其集成了自己父窗口的样式!
对顶层窗口(没有父窗口),其有若干个子窗口,则当我们用setStyleShette来设置这个顶层窗口的样式后,该父窗口本身没有任何变化,亦即设置没有生效;而其子窗口:只要子窗口本身没有用setStyleShette来设置自己的样式表,则其就是用的自己父窗口的样式表!!

所以,这里我建议不论你的背景界面是否是父窗体,设置背景的话,建议用painter设置;界面上其他小控件可以用stylesheet设置。painter的使用方法类似于:

void EntranceForm::paintEvent(QPaintEvent * e)
{
    QPainter painter( this );
    painter.drawPixmap( 0, 0, QPixmap(":/image/resource/images/background.png").scaled(size()));
    QWidget::paintEvent( e );
}

 

 

 

相关文章: