Виджет 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

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

и это когда мои виджеты наследуются от QLabel

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

Как я могу заставить свои виджеты наследоваться от 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;
}

поделитесь стилями.css

eyllanesc 13.12.2020 18:14

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

James Smith 13.12.2020 18:15

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

eyllanesc 13.12.2020 18:15

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

eyllanesc 13.12.2020 18:16

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

James Smith 13.12.2020 18:19
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
731
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 {}. См. главу типы селекторов в документации по синтаксису таблиц стилей.

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

musicamante 13.12.2020 19:31

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

James Smith 14.12.2020 09:50

Другие вопросы по теме