`
tubaluer
  • 浏览: 1435589 次
文章分类
社区版块
存档分类
最新评论
  • sblig: c / c++ 是不一样的都会输出 100
    j = j++

Qt中设置widget背景颜色/图片的注意事项(使用样式表 setStyleSheet())

 
阅读更多

在Qt中设置widget背景颜色或者图片方法很多种:重写paintEvent() , 调色板QPalette , 样式表setStyleSheet等等。

但是各种方法都有其注意事项,如果不注意则很容易陷入麻烦中。

1:setStyleSheet()

这个函数我一直很喜欢使用,因为只要写一句就可以实现效果,比其他方法都简单,但是其却有一个很值得注意的地方,也就是这个地方让我大吃苦头。

亦即:①:该函数只能用于设置有父窗口的子窗口的背景!如果一个窗口没有子窗口,则无法使用该函数来设置背景颜色或图 片!!

②:同时:对于一个父窗口而言:如果我们用setStyleShette设置了其样式,而对于其子窗口:如果没有用同样的函数来设 置的话, 则其子窗口的样式和其父窗口完全一致,亦即:其集成了自己父窗口的样式!

③:延伸:对顶层窗口(没有父窗口),其有若干个子窗口,则当我们用setStyleShette来设置这个顶层窗口的样式后,依据①可知:该父窗口本身没有任何变化,亦即设置没有生效;而其子窗口:只要子窗口本身没有用setStyleShette来设置自己的样式表,则其就是用的自己父窗口的样式表!!

例如:

主窗口(没有父类)为MainWin

MainWin::MainWin()

{

this->setStyleSheet("background-image:url(:/bmp/IMG_0345.JPG)");

iButton = new QPushButton(this);

iLabel = new QLabel(iButton);

}

运行一下,效果如下:

亦即:虽然我们设置的是顶层的父窗口,但是该样式却是在其子窗口中生效,而顶层父窗口没有任何变化! 这验证了①。

修改一下上例代码:

MainWin::MainWin()

{

this->setStyleSheet("background-image:url(:/bmp/IMG_0345.JPG)");

iButton = new QPushButton(this);

iLabel = new QLabel(iButton);

iLabel->setStyleSheet("background-image:url(:/bmp/1257253475842.jpg)");

}

则运行效果如下:

可见:子窗口只有调用setStyleSheet()设置了自己的样式后才可以隔断父窗口的样式,否则其将是用父窗口的样式。

再修改一下代码:

MainWin::MainWin()

{

iButton = new QPushButton(this);

iButton->setStyleSheet("background-image:url(:/bmp/IMG_0345.JPG)");

iLabel = new QLabel(iButton);

}

运行一下,效果如下:

可见:设置有父窗口的子窗口时:setStyleSheet()一定生效!!!

后来我又思考了一个问题,那就是:对于顶层父窗口,如果我setStyleSheet()设置了样式表,而对其子窗口,我用其他方法,比如用QPalette调色板来设置背景图片/颜色,这时子窗口的背景到底是由继承自父窗口的样式表决定呢还是由子窗口本身的QPalette调色板决定呢?

再次修改代码:

MainWin::MainWin()

{

this->setStyleSheet("background-image:url(:/bmp/IMG_0345.JPG)");

iButton = new QPushButton(this);

iLabel = new QLabel(iButton);

QPalette palette;

palette.setBrush(iLabel->backgroundRole(),QBrush(QImage(":/bmp/1257253475842.jpg")));

iLabel->setPalette(palette);

iLabel->setAutoFillBackground(true);

}

此段代码中我用QPalette来设置子窗口的背景图片,看下到底是样式表还是调色板生效,效果如下:

由此可见:一旦顶层窗口设置了样式表,则其子窗口无论用什么方法来设置背景,都会不生效!!!

那如果不是顶层窗口而仅仅是一般窗口设置了样式表呢?再次修改代码:

MainWin::MainWin()

{

iButton = new QPushButton(this);

iButton->setStyleSheet("background-image:url(:/bmp/IMG_0345.JPG)");

iLabel = new QLabel(iButton);

QPalette palette;

palette.setBrush(iLabel->backgroundRole(),QBrush(QImage(":/bmp/1257253475842.jpg")));

iLabel->setPalette(palette);

iLabel->setAutoFillBackground(true);

}

运行效果同上,这说明:不管是顶层窗口还是一般窗口,只要用setStyleSheet设置了样式表,则其子窗口用其它方式设置背景颜色/图片均不生效,只能用同样方式setStyleSheet来设置更改!!!

为了验证上边的结论,再次修改代码:

MainWin::MainWin()

iButton = new QPushButton(this);

iLabel = new QLabel(iButton);

QPalette palette;

palette.setBrush(iLabel->backgroundRole(),QBrush(QImage(":/bmp/1257253475842.jpg")));

iLabel->setPalette(palette);

iLabel->setAutoFillBackground(true);

}

运行一下:

此时调色板才生效,这也间接证明了上述结论。

==========================================================================

总结:

1:不要在顶层窗口(无父类的窗口)中使用setStyleSheet() ,否则其一父窗口的背景不会改变,其次其子窗口的背景设置方法变得局限唯一,不能再使用其它方法!

2:如果一个一般窗口(非顶层窗口)还有子窗口,那最好不要使用setStyleSheet()来设置其背景颜色,因为虽然此时该窗口的背景设置是生效的,但是其子窗口的背景设置也变得局限唯一,只能使用setStyleSheet,而不能使用其它方法! 当然:你如果就是只想使用这种方法,那也完全可以!!

说白了就是:不要再MainWindow中使用setStyleSheet()!

而上边之所以强调拓宽子窗口设置背景的方法范围,这是因为:如果只能用setStyleSheet样式表来设置背景图片的话,该图片是无法缩放的,如果其大小与widget窗口大小不相符,则我们无法用程序来实现图片的缩放,除非我们直接处理图片使其大小与widget窗口相符; 而如果不局限于用setStyleSheet样式表来设置的话,我们可以选择用QPalette调色版,其内部setBrush()之前,我们完全可以先对图片进行scale缩放再刷到窗口上,这样就避免直接去处理图片,灵活性强一点!

==========================================================================

注意:该文只针对QWidget体系,并不适用用QGraphicsWidget体系!关于这两种体系之间的区分,详见文章http://blog.csdn.net/NRC_DouNingBo/archive/2010/05/09/5571149.aspx

测试环境:Qt4.5.0 + vc2005

分享到:
评论

相关推荐

    QT样式表简介

    Qt样式表的思想很大程度上是来自于HTML的层叠式样式表(CSS), 通过调用QWidget::setStyleSheet()或QApplication::setStyleSheet(), 你可以为一个独立的子部件、整个窗口,甚至是整个个应用程序指定一个样式表。...

    qt SetStylesheet详细文档和例子

    qt SetStylesheet详细文档和例子,可用于qt SetStylesheet来美化界面

    Qt 自定义QPushButton样式表(实时生成QSS)

    源码可直接编译运行,自定义QPushButton样式,通过选择背景渐变、边框、字体、字号、鼠标移入移出切换、点击态、圆角设置等自动生成样式code,然后调用setStyleSheet()。

    QT怎么设置字体轮廓、字体位置、字体样式、字体间距、窗口背景色大小、隐藏鼠标图标

    QT怎么设置字体轮廓、字体位置、字体样式、字体间距、窗口背景色大小、隐藏鼠标图标

    Qt 自定义QPushButton样式表

    自定义QPushButton样式,通过选择背景渐变、边框、字体、字号、鼠标移入移出切换、点击态等自动生成样式code,然后调用setStyleSheet().....

    QT_BUT_Strle.rar

    使用setStyleSheet来进行设置Button样式实例以及源代码、QT样式表属性完整版、QT系统字体、程序示例以及完整原始代码、启动动画示例、QT为按钮、标签添加图片的几种方法、QButton弹出菜单、QT界面换肤解决方案和解决...

    Qt样式表文件

    #样式说明 1. 灰色经典 l3d.qss 2. 无样式 nostyle.qss 3. 蓝色经典 stype.qss #使用方法 QString skinFile = "l3d.qss"; QFile qssFile(skinFile); qssFile.open(QFile::ReadOnly); if(qssFile.isOpen()) { ...

    基于qt的程序,演示了如何通过setStyleSheet配置checkbox按钮的外观。

    基于qt的程序,演示了如何通过setStyleSheet配置checkbox按钮的外观。包括源代码和可执行程序。

    qt皮肤,qtcss样式

    下面将通过几个例子来介绍一下怎样使用Qt中的部件类型设计。自定义的前台背景与后台背景的颜色: 如果需要样一个文本编辑器的背景变为黄色, 下面是代码行: qApp->setStyleSheet("QLineEdit { background-color: ...

    pyqt5实现按钮添加背景图片以及背景图片的切换方法

    对与控件QPushButton中的可以使用setStyleSheet设置它背景图片。具体设置背景图片的方法有两种 self.button.setStyleSheet(QPushButton{background-image: url(img/1.png)}) 然而对于这种方法背景图片无法进行边框...

    福优林@Qt5小白变大牛初级篇word---第10章.pdf

    10.1 何为Qt样式表 由于Qt样式表的引入,定制Qt部件的外观样式变得非常简单。 Qt样式表的思想很大程度上是来自于HTML的层叠式样式表(CSS), 通过调用QWidget::setStyleSheet()或QApplication::setStyleSheet(), 你...

    QtStyleSheetDemo.rar

    QT样式表setStyleSheet使用例程,包含13种不同的样式,实现简单换皮肤效果。 (关注可不用积分下载) 查看效果:https://blog.csdn.net/long00000kid/article/details/114982478

    【代码工具】Qt 自定义QPushButton样式表(灵活选择)

    【源码可运行】自定义QPushButton样式,通过选择背景渐变、边框、字体、字号、鼠标移入移出切换、点击态等自动生成样式code,然后调用setStyleSheet()。

    使用PyQt4 设置TextEdit背景的方法

    先简单做个分享,有时间再补一个完整的用例 self.textEdit = QtGui.QTextEdit(slef) 1.设置背景颜色 self.textEdit.setStyleSheet(...以上这篇使用PyQt4 设置TextEdit背景的方法就是小编分享给大家的全部内

    python之pyqt5通过按钮改变Label的背景颜色方法

    使用setStyleSheet方法修改得到自己想要的字体,大小,颜色 self.lab = QLabel(标签字体大小颜色, self) self.lab.setGeometry(50,50,300,200) self.setStyleSheet(QLabel{color:rgb(225,22,173,255);font-size:50px;...

    pyqt-stylesheets:PyQt5样式表作为子模块

    qt_widget.setStyleSheet(style_string) 延长 在src中创建新文件夹。 文件夹名称将为样式名称 创建PyQt的资源文件style.qrc含style.qss和其他文件,如图标的PNG 创建pyqt资源文件style.qss 资源python

    QT自定义精美换肤界面(主题资源CSS暗黑风格)源码可用

    QT自定义精美换肤界面,主题资源CSS(暗黑风格)源码亲测可用 引用简单: QFile file(QString("./css/%1.css").arg("stylesheet")); file.open(QFile::ReadOnly); QString qss = QLatin1String(file.readAll()); ...

    qss.rar_Qt qss_qt qss下载_qt qss 下载_qt setstysheet

    Qt中qss和setStyleSheet的5个示例,都是我网上找资料,不足的地方自己写出来的,希望对大家有所帮助。

    Qt stylesheet

    Qt stylesheet 感觉还不错。I think this is a good resoure for qt stylesheet new leaner.

    qss样式的作用范围及其替换、覆盖

    可以在main函数中,直接给QApplication设置样式,此样式为全局样式,对整个应用都生效 QString qstrStyle = QPushButton{color:blue;} a.setStyleSheet(qstrStyle); 2)设置窗口样式 可以给某个窗口对象设置样式 w...

Global site tag (gtag.js) - Google Analytics