pyqt小部件未扩展到父级

2024-10-03 02:42:04 发布

您现在位置:Python中文网/ 问答频道 /正文

试图让一个自定义小部件扩展到父级,当我的小部件从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继承时的布局

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

Tags: importselfinitmain部件itemclasscolor
1条回答
网友
1楼 · 发布于 2024-10-03 02:42:04

无论何时从QWidget或QLabel中创建子类,MenuWidget类的大小都完全相同

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

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)

如果使用^ {CD2>}作为样式表选择器,请考虑这不是一个好的选择,因为可访问的名称可以是本地化EME>,而不是在样式表中标识类的正确方法。请改用objectName()#objectName {}选择器。请参阅样式表语法文档中的selector types一章

相关问题 更多 >