pyqt 小部件未扩展到父级

pyqt widget not expanding to parent

试图让一个自定义小部件扩展到父级,它只是在我的小部件继承自 QLabel 而不是 QWidget 时做我想做的。我已尝试设置 QSizePolicy,但它似乎仍然不起作用

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QVBoxLayout
from mywidgets import MenuLabel, MenuWidget, MainWidget


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("InstaPlus")
        outerlayout = QHBoxLayout()
        outerlayout.setContentsMargins(0, 0, 0, 0)
        outerlayout.setSpacing(0)

        menulayout = QVBoxLayout()
        menulayout.setContentsMargins(0, 0, 0, 0)
        menulayout.setSpacing(0)

        menuwidget = MenuWidget()
        mainwidget = MainWidget()

        menulayout.addWidget(MenuLabel("Menu Item 1"))
        menulayout.addWidget(MenuLabel("Menu Item 2"))
        menulayout.addWidget(MenuLabel("Menu Item 3"))
        menulayout.addWidget(MenuLabel("Menu Item 4"))
        menulayout.addWidget(MenuLabel("Menu Item 5"))
        menulayout.addStretch()
        menuwidget.setLayout(menulayout)

        outerlayout.addWidget(menuwidget)
        outerlayout.addWidget(mainwidget)

        self.setLayout(outerlayout)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    main = Window()
    main.resize(800, 500)
    main.show()
    sys.exit(app.exec_())

这是我的 mywidgets 代码

from PyQt5.QtWidgets import QLabel, QWidget, QSizePolicy


class MenuLabel(QLabel):
    def __init__(self, title):
        super().__init__()
        self.title = title
        self.setText(self.title)
        self.setStyleSheet(open("styles.css").read())


class MenuWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.setAccessibleName("menu")
        self.setStyleSheet(open("styles.css").read())
        self.setFixedWidth(200)


class MainWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.setAccessibleName("main")
        self.setStyleSheet(open("styles.css").read())

这里是继承QWidget时的布局

当我的小部件从 QLabel 继承时就是这样

如何让我的小部件从 Qwidget 继承并让它们像 QLabel 一样调整大小?

这是样式文件

MenuLabel{
    background-color: #484848;
    color: #dadada;
    padding-left: 10px;
    padding-top: 5px;
    padding-bottom: 5px;
    padding-right: 100px;
    font-size: 10pt;
    font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', 'Verdana', sans-serif
}

MenuLabel:hover{
    background-color: rgba(8, 3, 9, 0.65);
    }

[accessibleName="menu"]{
    background-color: #484848;
}

[accessibleName="main"]{
    background-color: #2e2e2e;
}

无论何时从 QWidget 或 QLabel 子class,您的 MenuWidget class 的大小都完全相同。

问题是当从 QWidget 子classing 时,设置样式表是不够的。正如官方stylesheet reference documentation解释的那样:

If you subclass from QWidget, you need to provide a paintEvent for your custom QWidget.

class MenuWidget(QWidget):
    # ...
    def paintEvent(self, event):
        opt = QtWidgets.QStyleOption()
        opt.initFrom(self)
        qp = QtGui.QPainter(self)
        self.style().drawPrimitive(QtWidgets.QStyle.PE_Widget, opt, qp, self)

如果您只是将 accessibleName() 用作样式表选择器,请考虑这不是一个好的选择,因为可访问的名称可以(应该)是 localized并且不是在样式表中识别 class 的正确方法。请改用 objectName()#objectName {} 选择器。请参阅样式表语法文档中的 selector types 章节。