Qt4窗口及控件风格设置过程

    由于 QWidget 一般只作为控件的承载窗口,它并没有在其 paintEvent 里面处理 QStyle ,留下了空函数体的 paintEvent 函数,那么在改变 QWidget 的背景时,要么改变其 QPalette 的属性,要么重载其 paintEvent 函数来自行绘制。
    这里存在两种情况,一种是 QWidget 作为顶层窗口,此时由于它不再有父窗体,则没有继承任何 QStyle 。那么通过改变其 QPalette 可以改变背景等属性。一种是 QWidget 作为子窗口,此时它将继承父窗体的 QStyle ,那么设置 QPalette 的属性将不再起作用。
    当使用 QWidget 作为子窗体时,要想让它不使用父窗体的 QStyle ,则需要在其 paintEvent 函数里设置自定义的 QSyle ,并通过该 QStyle 进行绘制。 QStyle 作为一个界于 QPainter 之上的绘制引擎,传递必要的参数给 QPainter ,使用 QPainter 完成绘制。
    在这里有一个奇怪的现象。如果在实例化一个 QWidget 的位置设置其 style ,使用 setStyleSheet 函数,将会对 QWidget 及其子窗体有效。如果在 QWidget 的构造函数里使用 setStyleSheet 函数,则对该 QWidget 无效,而 QWidget 上的子窗体有效。但是如果在实例化如 QPushButton 等控件时对该控件使用 setStyleSheet ,或者在 QPushButton 构造函数里使用 setStyleSheet ,均有效。
    上边提到了 setStyleSheet 函数,这个函数使用类似 CSS 样式的语法来设置 Syle 属性,参考 Qt Style Sheets 的文档可以查看其语法形式。