为啥这个自定义 QWidget 不能正确显示
Posted
技术标签:
【中文标题】为啥这个自定义 QWidget 不能正确显示【英文标题】:Why doesn't this custom QWidget display correctly为什么这个自定义 QWidget 不能正确显示 【发布时间】:2018-05-01 18:32:38 【问题描述】:我正在用更好的代码示例重试这个问题。
下面的代码,以其当前形式,将在一个窗口中显示一个绿色阴影QWidget
,这正是我想要的。但是,在注释掉该行时:
self.widget = QWidget(self.centralwidget)
并取消注释,
self.widget = Widget_1(self.centralwidget)
绿色框不显示。 Widget_1
类是QWidget
的一个简单子类,所以我正试图围绕发生故障的地方展开思考。没有错误消息,Widget_1
类中的print("Test")
行输出正常,所以我知道一切都被正确调用。
我不打算使用任何类型的自动布局,因为我不需要在这里介绍。您能帮我理解为什么没有显示绿色矩形吗?为了使用 Widget_1
类,我需要进行哪些更正?
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget
from PyQt5.QtCore import QRect
import sys
class Main_Window(object):
def setupUi(self, seating_main_window):
seating_main_window.setObjectName("seating_main_window")
seating_main_window.setEnabled(True)
seating_main_window.resize(400, 400)
self.centralwidget = QWidget(seating_main_window)
self.centralwidget.setObjectName("centralwidget")
########### The following two lines of code are causing the confusion #######
# The following line, when uncommented, creates a shaded green box in a window
self.widget = QWidget(self.centralwidget) # Working line
# The next line does NOT create the same shaded green box. Where is it breaking?
# self.widget = Widget_1(self.centralwidget) # Non-working line
self.widget.setGeometry(QRect(15, 150, 60, 75))
self.widget.setAutoFillBackground(False)
self.widget.setStyleSheet("background: rgb(170, 255, 0)")
self.widget.setObjectName("Widget1")
seating_main_window.setCentralWidget(self.centralwidget)
class Widget_1(QWidget):
def __init__(self, parent=None):
super().__init__()
self.setMinimumSize(10, 30) # I put this in thinking maybe I just couldn't see it
print("Test") # I see this output when run when Widget_1 is used above
class DemoApp(QMainWindow, Main_Window):
def __init__(self):
super().__init__()
self.setupUi(self)
if __name__ == '__main__': # if we're running file directly and not importing it
app = QApplication(sys.argv) # A new instance of QApplication
form = DemoApp() # We set the form to be our ExampleApp (design)
form.show() # Show the form
app.exec_() # run the main function
【问题讨论】:
【参考方案1】:根据这篇 Qt Wiki 文章:
How to Change the Background Color of QWidget您必须在自定义 QWidget
子类中实现 paintEvent
才能使用样式表。此外,由于小部件不是布局的一部分,因此您必须为其指定父级,否则将不会显示。所以你的Widget_1
类必须是这样的:
from PyQt5.QtWidgets import QStyleOption, QStyle
from PyQt5.QtGui import QPainter
class Widget_1(QWidget):
def __init__(self, parent=None):
super().__init__(parent) # set the parent
print("Test")
def paintEvent(self, event):
option = QStyleOption()
option.initFrom(self)
painter = QPainter(self)
self.style().drawPrimitive(QStyle.PE_Widget, option, painter, self)
super().paintEvent(event)
【讨论】:
我永远不会明白这一点。谢谢!以上是关于为啥这个自定义 QWidget 不能正确显示的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的自定义 UITableViewCell 宽度在初始加载时不正确?