#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
и это когда мои виджеты наследуются от 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.