Pyqt6 / Python: не работают стили при добавлении виджетов
Не понимаю почему не работают стили? Объясните более подробно, пожалуйста, я только начал изучать библиотеку PyQt6.
У меня есть данный код, я хочу чтобы к SubWidget()
применялись стили, но когда использую setstylesheet
на прямую, он не работает.
В добавок в SubWidget()
не подсвечиваются .addWidget
and removeWidget
, хотя они работают в коде.
Что я делаю не так?
from PyQt6.QtCore import QSize.
from PyQt6.QtWidgets import QApplication, QMainWindow, QWidget, QPushButton, QLabel, QVBoxLayout, QHBoxLayout
import sys
class SubWidget(QWidget):
def __init__(self, label_text, button_text, parent_layout) -> None:
super().__init__()
self.setObjectName("subWidget")
self.layout = QHBoxLayout()
self.parent_layout = parent_layout
self.label = QLabel(label_text)
self.button_delete = QPushButton(button_text)
self.button_delete.clicked.connect(self.delete_widget)
self.layout.addWidget(self.label)
self.layout.addWidget(self.button_delete)
self.setLayout(self.layout)
def delete_widget(self):
self.setParent(None)
self.parent_layout.removeWidget(self)
self.deleteLater()
class MainWindow(QMainWindow):
def __init__(self) -> None:
super().__init__()
self.setObjectName("mainWindow")
self.setWindowTitle("Widget")
self.setFixedSize(QSize(350, 500))
central_widget = QWidget(self)
self.setCentralWidget(central_widget)
self.main_layout = QVBoxLayout(central_widget)
self.widget_layout = QVBoxLayout()
self.main_layout.addLayout(self.widget_layout)
create_label_btn = QPushButton("Create")
self.main_layout.addWidget(create_label_btn)
def create_label() -> None:
new_widget = SubWidget("New Label", "Delete", self.widget_layout)
self.widget_layout.addWidget(new_widget)
create_label_btn.clicked.connect(create_label)
StyleSheet = """
#mainWindow {
background-color: darkblue;
border-radius: 10px;
}
#subWidget {
border: 2px solid black;
margin: 5px;
padding: 5px;
background-color: lightgray;
}
QPushButton {
background-color: gray;
border: none;
padding: 5px;
}
"""
if __name__ == "__main__":
app = QApplication(sys.argv)
app.setStyleSheet(StyleSheet)
window = MainWindow()
window.show()
app.exec()
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Я немного переписал ваш код и отметил для вас все изменения, которые внес. Расцветку виджетов поменяете как вам нравится, я сделал такую чтобы вам было все видать.
Поменяйте импорты на PyQt6 и попробуйте.
import sys
'''
from PyQt6.QtCore import QSize
from PyQt6.QtWidgets import QApplication, QMainWindow, QWidget, \
QPushButton, QLabel, QVBoxLayout, QHBoxLayout
'''
from PyQt5.Qt import *
# +++ --------> vvvvvv <--------------------------------------------------
class SubWidget(QFrame): # QWidget
def __init__(self, label_text, button_text, parent) -> None:
super().__init__()
# ? self.parent_layout = parent_layout
self.parent = parent # ?
self.setObjectName("subWidget")
self.label = QLabel(label_text)
self.label.setAlignment(Qt.AlignCenter) # +++
self.button_delete = QPushButton(button_text)
self.button_delete.clicked.connect(self.delete_widget)
self.layout = QHBoxLayout(self)
self.layout.addWidget(self.label, stretch=1) #+ stretch=1
self.layout.addWidget(self.button_delete, stretch=0) #+ stretch=0
def delete_widget(self):
# ? self.setParent(None)
# ? self.parent_layout.removeWidget(self)
self.deleteLater()
class MainWindow(QMainWindow):
def __init__(self) -> None:
super().__init__()
self.setObjectName("mainWindow")
self.setWindowTitle("MainWindow")
self.number = 1 # +++
# ? self.setFixedSize(QSize(350, 500))
central_widget = QWidget(self)
central_widget.setObjectName("centralwidget")
self.setCentralWidget(central_widget)
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
self.scroll_area = QScrollArea()
self.scroll_area.setObjectName("scrollarea")
self.scroll_area.setWidgetResizable(True)
self.scroll_widget = QWidget()
self.scroll_widget.setAutoFillBackground(True)
self.scroll_widget.setStyleSheet("border-radius: 10px;")
self.widget_layout = QVBoxLayout(self.scroll_widget)
self.widget_layout.setContentsMargins(0, 0, 0, 0)
self.scroll_area.setWidget(self.scroll_widget)
create_label_btn = QPushButton("Create")
create_label_btn.clicked.connect(self.create_label)
self.main_layout = QVBoxLayout(central_widget)
# self.main_layout.addLayout(self.widget_layout)
self.main_layout.addWidget(self.scroll_area) # +++
self.main_layout.addWidget(
create_label_btn, alignment=Qt.AlignCenter | Qt.AlignBottom)
def create_label(self) -> None:
new_widget = SubWidget(f"New Label {self.number}",
"Delete",
self # self.widget_layout
)
self.widget_layout.addWidget(new_widget)
self.number += 1
StyleSheet = """
#mainWindow { /* ?????????????????? */
background-color: #ff0; /* darkblue */
border-radius: 10px;
}
#centralwidget { /* +++++++++ */
background-color: #5d7; /* darkblue */
border-radius: 20px; /* 10 */
}
#scrollarea { /* +++++++++ */
background-color: #5f7; /* darkblue */
border-radius: 10px; /* 10 */
}
#subWidget {
border: 2px solid #fff; /* black */
border-radius: 10px;
background-color: #abc; /* lightgray */
}
QLabel { /* +++++++++ */
background-color: green;
color: #fff;
border-radius: 10px;
}
QPushButton {
background-color: gray;
border: none;
padding: 5px;
border-radius: 10px; /* +++++++++ */
}
"""
if __name__ == "__main__":
app = QApplication(sys.argv)
app.setStyleSheet(StyleSheet)
app.setFont(QFont("Times", 12, QFont.Bold)) # +
window = MainWindow()
window.resize(QSize(350, 500)) # +
window.show()
app.exec()