首页 > 解决方案 > pyqt 小部件未扩展到父级

问题描述

试图让一个自定义小部件扩展到父级,它只是在我的小部件继承自 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_())

这是我的小部件代码

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 继承时的布局

QWidget

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

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;
}

标签: pythonuser-interfacepyqtpyqt5

解决方案


每当您从 QWidget 或 QLabel 子类化时,您的类的大小MenuWidget完全相同。

问题是当从 QWidget 子类化时,设置样式表是不够的。正如官方样式表参考文档所解释的:

如果你从 QWidget 继承,你需要为你的自定义 QWidget 提供一个paintEvent。

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()仅将其用作样式表选择器,请考虑这不是一个好的选择,因为可访问名称可以(应该)本地化,并且不是识别样式表中的类的正确方法。改用选择器objectName()#objectName {}选择器。请参阅样式表语法文档中的选择器类型章节。


推荐阅读