пытаюсь получить пользовательский виджет для расширения до родительского, и он делает только то, что я хочу, когда мои виджеты наследуются от 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
и это когда мои виджеты наследуются от 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, т.е. Класс MenuWidget(QWidget): Второе фото наследуется от QLabel, т.е.… Класс MenuWidget(QLabel): Я хотел бы, чтобы эти виджеты наследуются от QWidget, но расширяются, чтобы соответствовать размеру родитель. также добавлены styles.css
Размер вашего класса 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)
, если он еще не установлен для класса.
Спасибо за помощь. Мне нужен только цвет фона, поэтому думаю, что вместо этого я просто унаследую от QFrame. Я также теперь изменил свой стиль, чтобы использовать имя объекта вместо доступного имени.
поделитесь стилями.css