pyqt виджет не расширяется до родительского

#python #user-interface #pyqt #pyqt5

#python #пользовательский интерфейс #pyqt #pyqt5

Вопрос:

пытаюсь заставить пользовательский виджет расширяться до родительского, и он делает только то, что я хочу, когда мои виджеты наследуются от 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;
}
 

Комментарии:

1. поделитесь styles.css

2. улучшен отступ

3. какие у меня виджеты ?

4. Что мне нужно изменить, чтобы получить второе изображение?

5. первое изображение — это когда пользовательские виджеты наследуются от QWidget ie .. Класс MenuWidget(QWidget): Второе фото наследуется от QLabel ie… Класс MenuWidget(QLabel): я бы хотел, чтобы эти виджеты наследовались от QWidget, но расширялись до размера родительского. также теперь добавлен styles.css

Ответ №1:

Размер вашего MenuWidget класса точно такой же, когда вы создаете подкласс из QWidget или QLabel.

Проблема в том, что при создании подклассов из QWidget недостаточно установить таблицу стилей. Как объясняется в официальной справочной документации по таблицам стилей:

Если вы создаете подкласс из QWidget, вам необходимо предоставить paintEvent для вашего пользовательского 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() только как селектор таблиц стилей, учтите, что это не лучший выбор, поскольку доступное имя может (должно) быть локализовано и не является правильным методом для идентификации класса в таблицах стилей. objectName() Вместо этого используйте и #objectName {} селектор. Смотрите главу «Типы селекторов» в документации по синтаксису таблиц стилей.

Комментарии:

1. @JamesSmith Обратите внимание, что если вам нужен только цвет фона, есть и другие альтернативы: просто используйте qp.fillRect(self.rect(), color) вместо создания QStyleOption, используйте класс контейнера, который поддерживает стиль (например, QFrame, который по совпадению является тем же классом, от которого наследует QLabel), или установите палитру с определенным Window цветом роли навиджет контейнера и убедитесь, что он вызывается setAutoFillBackground(True) , если он еще не установлен для класса.

2. Спасибо за всю помощь. Мне нужен только цвет фона, поэтому я думаю, что вместо этого я просто унаследую от QFrame. Я также изменил свой стиль, чтобы использовать objectName вместо accessibleName.