在PySide/PyQt中对QLabel应用setStyle

0 投票
1 回答
7810 浏览
提问于 2025-04-18 09:05

在PySide中,我想要改变一个简单的图形用户界面(GUI)窗口的整体风格(一个QLabel对象),具体内容可以参考PySide的文档:

http://srinikom.github.io/pyside-docs/PySide/QtGui/QStyle.html#detailed-description

也就是说,正如链接中所描述的,我想使用setStyle来把整个GUI的格式改成预定义的某种风格(比如,从Windows改成Cleanlooks)。我下面提到的,这个目标和使用setStyleSheet来调整颜色等是不同的,我已经知道怎么做了。

为了开始,我首先检查了我可以使用的风格类型:

print QtGui.QStyleFactory.keys()

这显示了许多可用的风格,包括'Cleanlooks'。

其次,基于来自三个来源的文档(PySideZetCodeNullege),我尝试把我的QLabel风格改成'Cleanlooks':

QtGui.QApplication.setStyle(QtGui.QStyleFactory.create('Cleanlooks'))

不幸的是,这并没有改变任何东西。实际上,我输入的任何内容都没有改变我的Hello World小部件的任何像素。不知道这是否相关,但当我打印前一行代码的输出时,我总是得到None。完整的示例代码在下面。

我在Windows 7上,使用Python 2.7在iPython中运行。根据回复,这似乎也是Windows 7中PyQt4的问题,而不仅仅是PySide。

为了更清楚,我并不是在询问如何使用setStyleSheets来调整我的小部件。这已经有不错的解答了:在Pyside + Python中使用类进行样式设置


我尝试的代码示例(我尝试的其他变体在评论中显示):

# coding: utf-8

import sys
from PySide import QtGui

class HelloWorldApp(QtGui.QLabel):
    def __init__(self):
        QtGui.QLabel.__init__(self, "Hello, world!") 
        self.initUI()

    def initUI(self): 
        QtGui.QApplication.setStyle(QtGui.QStyleFactory.create('Cleanlooks'))
        self.show()

def main():
    #QtGui.QApplication.setStyle(QtGui.QStyleFactory.create('Cleanlooks'))  #crashes program
    qt_app=QtGui.QApplication(sys.argv)
    #QtGui.QApplication.setStyle(QtGui.QStyleFactory.create('Cleanlooks'))  #does nothing
    exHell=HelloWorldApp()
    sys.exit(qt_app.exec_())

if __name__=="__main__":
    main()

1 个回答

1

我找到的最有帮助的资源,就是这个很棒的小部件画廊,它解答了我的问题:

小部件画廊

这个画廊展示了各种类型的小部件在不同风格下的样子。

结果发现,我对QLabel的“问题”其实并不是bug,而是因为一个简单的QLabel太基础了,改变它的样式通常不会影响它的外观。也就是说,当它是你显示的唯一内容时,改变样式也不会明显(就像我在问题中提到的Hello World例子)。

正如预期的那样,当我把例子中的简单QLabel换成一个下拉框或者其他更复杂的小部件时,样式的差异就非常明显了,正如小部件画廊中所描述的那样。

顺便提一下,上面的这个小部件画廊是在我询问这个问题时,在Qt Centre上提到的。

撰写回答