为什么边框和背景图像样式的QWidget与QLabel,QDialog,......的行为不同?

时间:2014-07-09 12:13:10

标签: qt background stylesheet pyside qwidget

我使用Qt4.8 Python绑定PySide(Windows上的Python 3.3版本1.2.2),我发现QWidgetQWidget派生的小部件(如QDialog,{}的行为不同使用样式表进行样式设置时,{1}}或QLabel

我特别注意到,必须将属性QMainWindow设置为显示边框或背景图像,同时独立设置背景颜色。与其他小部件相比,此属性没有影响,始终显示边框或背景图像。覆盖WA_StyledBackground方法也是可能的。

示例代码:

paintEvent

本主题已在StackOverflow上进行了部分讨论。 Borders and background of QWidget aren't set by stylesheet上接受的答案建议覆盖from PySide import QtGui, QtCore class MyWidget(QtGui.QWidget): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def paintEvent(self, event): opt = QtGui.QStyleOption() opt.initFrom(self) painter = QtGui.QStylePainter(self) painter.drawPrimitive(QtGui.QStyle.PE_Widget, opt) def display(w): print(w.__class__.__name__) w.setWindowTitle(w.__class__.__name__) print(' WA_StyledBackground is {}'.format(w.testAttribute(QtCore.Qt.WA_StyledBackground))) print(' autoFillBackground is {}'.format(w.autoFillBackground())) w.setStyleSheet('border: 4px inset #515c84; border-radius: 9px; background-color: blue; background-image: url(test.png);') w.resize(400, 400) w.show() app = QtGui.QApplication([]) w1 = QtGui.QMainWindow(flags=QtCore.Qt.Window) display(w1) # works w2 = QtGui.QDialog(f=QtCore.Qt.Window) display(w2) # works w3 = QtGui.QWidget(f=QtCore.Qt.Window) w3.setAttribute(QtCore.Qt.WA_StyledBackground) display(w3) # works only with the previous line uncommented w4 = QtGui.QLabel('Text', f=QtCore.Qt.Window) display(w4) # works w5 = MyWidget(f=QtCore.Qt.Window) display(w5) # works app.exec_() How to set QWidget background color?接受的答案建议设置paintEvent以防万一使用调色板而PySide: QWidget does not draw background color建议设置上面提到的setAutoFillBackground。缺少的是WA_StyledBackground和派生小部件之间差异的原因。

我发现这些差异有点令人困惑:

  • 为什么QWidget的行为与QWidget等派生小部件不同??
  • 为什么QLabel在自然状态下不会显示边框或背景图像,但它会显示背景颜色?
  • 以所述方式设置属性QWidget和覆盖WA_StyledBackground之间是否存在差异?哪种方法更受欢迎?

1 个答案:

答案 0 :(得分:1)

tl; dr - 使用QFrame

我不会试图猜测进入此设计决策的推理,但一般来说QWidget被认为是无边界的。如果您希望您的小部件具有漂亮的样式边框,那么您应该使用QFrame,它基本上只是QWidget具有您正在寻找的边框样式功能。

您会注意到许多小部件(例如您提到的QLabel)实际上都是从QFrame继承,而不是直接从QWidget继承。

关于WA_StyledBackground财产,我不能权威地说话。