当前位置:嗨网首页>书籍在线阅读

11-样式表的使用

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

16.2.3 样式表的使用

1.程序中使用样式表

有多种方法可以应用样式表。

第一种是在使用Qt Designer设计窗体时,直接用样式表编辑器为窗体或窗体上的某个部件设计样式表,则设计的样式保存在窗体的ui文件里,窗体创建时会自动应用所设计的样式表。这样设计的样式表对应用程序是固定的,无法取得换肤的效果,而且需要为每个窗体都设计样式表,重复性工作量太大。

第二种是使用setStyleSheet函数应用样式,使用qApp的setStyleSheet()函数可以为应用程序全局设置样式,使用QWidget::setStyleSheet()可以为一个窗口、一个对话框或一个界面组件设置样式。例如:

qApp->setStyleSheet("QLineEdit { background-color: gray }");

这里使用应用程序全局变量qApp为QLineEdit设置样式,如果应用程序内的某些QLineEdit组件没有再被设置样式,则QLineEdit组件的背景色为灰色。

MainWindow->setStyleSheet("QLineEdit { background-color: lime }");

这是为主窗口MainWindow内的QLineEdit组件设置样式,即背景色为亮绿色。

editName->setStyleSheet("color: blue;"
                "background-color: yellow;"
                "selection-color: yellow;"
                "selection-background-color: blue;");

这是设置一个ObjectName为editName的QLineEdit组件的样式,注意这时在样式表中无需设置selector名称,所设置的样式是应用于editName这个QLineEdit组件的。

这样将样式表固定在程序中,很显然也是无法实现切换界面效果的。为了实现切换界面效果(换肤)的目的,一般将样式定义表保存为qss后缀的纯文本文件,然后在程序中打开文件,读取文本内容,再调用setStyleSheet()函数应用样式。示例代码如下:

QFile file(":/qss/mystyle.qss" );
file.open(QFile::ReadOnly);
QString styleSheet = QString::fromLatin1(file.readAll());
qApp->setStyleSheet(styleSheet);

2.样式定义的明确性

当多条样式法则对一个属性定义了不同值时,就会出现冲突,例如:

QPushButton#btnSave { color: gray }
QPushButton { color: red }

这两条法则都可以应用于ObjectName为btnSave的QPushButton组件,都定义了其前景色,这就会出现冲突。这时,选择器的明确性(specificity)决定组件适用的样式法则,即法则应用于更明确的组件。在上面的例子中,QPushButton#btnSave被认为是比QPushButton更明确的选择器,因为它指向一个对象,而不是QPushButton的所有实例。所以,如果是在一个窗口上应用以上两条法则,则btnSave按钮的前景色为gray,而其他按钮的前景色为red。

同样,具有伪状态的选择器被认为比没有伪状态的选择器明确性更强,如:

QPushButton:hover { color: white }
QPushButton { color: red }

这样,当鼠标在按钮上停留时颜色为white,否则颜色为red。

如果两个选择器具有相同的明确性,则以法则出现的先后顺序为准,后出现的法则起作用,例如:

QPushButton:hover { color: white }
QPushButton:enabled { color: red }

这里的两个选择器具有相同的明确性,所以,当鼠标停留在一个使能的按钮上时,只有第二条法则起作用。这种情况下,如果希望不出现冲突,应该修改法则以使其更明确,如下面这两条法则是不冲突的。

QPushButton:hover:enabled { color: white }
QPushButton:enabled { color: red }

父子关系的两个类作为选择器时,具有相同的明确性,例如:

QPushButton { color: red }
QAbstractButton { color: gray }

这两个选择器的明确性相同,所以只依赖于语句的先后顺序。

确定法则的明确性,Qt样式表遵循CSS2的规定,在设计样式表时应尽量明确并避免冲突情况。

3.样式定义的级联性

样式定义可以在qApp、窗口或一个具体组件中定义,任何一个组件的样式是其父组件、父窗口和qApp的样式的融合。当出现冲突时,组件会使用离自己最近的样式定义,即按顺序使用组件自己的样式、或父组件的样式定义、或父窗口的样式定义,或qApp的样式定义,而不考虑样式选择器的确定性。

例如,在QApplication中设置全局样式:

qApp->setStyleSheet("QPushButton { color: red }");

那么应用程序中所有未再定义样式的QPushButton的前景颜色为red。

如果在MainWindow中再定义样式:

MainWindow->setStyleSheet("QPushButton { color: blue }");

则MainWindow上的按钮的前景色为blue,而不是red。

如果MainWindow上有一个名称为btnSave的QPushButton按钮,其定义样式如下:

btnSave->setStyleSheet("color: yellow; background-color: black;");

则按钮btnSave按照自己的样式显示前景和背景色。

Qt样式表功能强大,可以设计自己想要的界面效果,但是这需要有较好的美工设计基础,需要在使用样式表的过程中不断尝试和总结经验。