Почему не работает QScrollArea?
Не работает QScrollArea, в принципе не появляется.
Помогите понять почему не работает?
import sys
import asyncio
from PyQt6.QtCore import QSize, Qt, QRect
from PyQt6.QtWidgets import QApplication, QMainWindow, QHBoxLayout, \
QWidget, QVBoxLayout, QPushButton, QLineEdit, QScrollArea, QLabel, \
QGridLayout
from parser.db import get_data_by_condition
class Window(QMainWindow):
def __init__(self) -> None:
super().__init__()
self.init_ui()
def init_ui(self):
self.add_button = QPushButton('Добавить')
self.add_button.clicked.connect(self.parse_data)
self.model = QLineEdit()
self.detail = QLineEdit()
self.article = QLineEdit()
input_layout = QHBoxLayout()
input_layout.setSpacing(12)
input_layout.addWidget(self.add_button)
input_layout.addWidget(self.model)
input_layout.addWidget(self.detail)
input_layout.addWidget(self.article)
input_widget = QWidget()
input_widget.setLayout(input_layout)
layout = QVBoxLayout()
container = QWidget()
self.scroll_layout = QVBoxLayout(container)
self.scroll_layout.addWidget(input_widget)
self.scroll_area = QScrollArea(container)
self.scroll_area.resize(900, 250)
self.scroll_area.setWidgetResizable(True)
self.scroll_widget = QWidget()
self.scroll_widget.setGeometry(QRect(0, 0, 380, 280))
self.scroll_layout_2 = QVBoxLayout(self.scroll_area)
self.grid_layout = QGridLayout()
self.scroll_layout_2.addLayout(self.grid_layout)
self.scroll_area.setWidget(self.scroll_widget)
self.scroll_layout.addWidget(self.scroll_area)
container.setLayout(layout)
self.setCentralWidget(container)
def parse_data(self):
model = self.model.text()
article = self.article.text()
detail = self.detail.text()
loop = asyncio.new_event_loop()
objects = loop.run_until_complete(get_data_by_condition(article, detail))
loop.close()
for obj in objects[:40]:
label = QLabel(f'{obj[0]} {obj[1]} {obj[2]} {obj[3]} {obj[4]} {obj[5]}')
label.setFixedHeight(20)
self.grid_layout.addWidget(label)
app = QApplication(sys.argv)
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
window = Window()
window.setFixedSize(QSize(900, 400))
window.show()
if __name__ == '__main__':
app.exec()
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Я не могу проверить ваш код и не знаю как будет себя вести интерфейс с вашей логикой.
Всегда запускайте свой код в консоли/терминале/CMD и вы получите реальные ошибки, если они у вас есть.
Ваш код выдает ошибку:
QWidget::setLayout: Attempting to set QLayout "" on QWidget "",
which already has a layout
У вас чехарда с менеджерами компоновки.
Я отметил для вас в коде как это правильно делается.
И еще, я совсем не понимаю зачем вы используете QLabel, почитайте о классе QTextBrowser и QTextEdit и примите правильное решение.
import sys
import asyncio
'''
from PyQt6.QtCore import QSize, Qt, QRect
from PyQt6.QtWidgets import QApplication, QMainWindow, QHBoxLayout, \
QWidget, QVBoxLayout, QPushButton, QLineEdit, QScrollArea, QLabel, \
QGridLayout
'''
from PyQt5 import QtWidgets, QtGui, QtCore # PyQt5
from PyQt5.Qt import *
#? from parser.db import get_data_by_condition
class Window(QMainWindow):
def __init__(self) -> None:
super().__init__()
self.init_ui()
def init_ui(self):
self.add_button = QPushButton('Добавить')
self.add_button.clicked.connect(self.parse_data)
self.model = QLineEdit('Пожалуйста')
self.detail = QLineEdit('просто нажмите')
self.article = QLineEdit('кнопку Добавить')
input_widget = QWidget()
input_layout = QHBoxLayout(input_widget)
input_layout.setSpacing(12)
input_layout.addWidget(self.add_button)
input_layout.addWidget(self.model)
input_layout.addWidget(self.detail)
input_layout.addWidget(self.article)
#? layout = QVBoxLayout()
container = QWidget()
self.scroll_layout = QVBoxLayout(container) # <---- тут уже установлен
self.scroll_layout.addWidget(input_widget)
self.scroll_area = QScrollArea(container) # 1
#? self.scroll_area.resize(900, 250)
self.scroll_area.setWidgetResizable(True) # 2
self.scroll_widget = QWidget() # 3
#? self.scroll_widget.setGeometry(QRect(0, 0, 380, 280))
# self.scroll_layout_2 = QVBoxLayout(self.scroll_area)
self.scroll_layout_2 = QVBoxLayout(self.scroll_widget) # 4
# ---------------------------------------> ^^^^^^^^^^^^^^^^^^ <------------
# ? self.grid_layout = QGridLayout()
# ? self.scroll_layout_2.addLayout(self.grid_layout)
self.scroll_area.setWidget(self.scroll_widget) # 5
self.scroll_layout.addWidget(self.scroll_area)
# QWidget::setLayout: Attempting to set QLayout "" on QWidget "", # <----
# which already has a layout # <----
#? container.setLayout(layout) # <----
self.setCentralWidget(container)
def parse_data(self):
model = self.model.text()
article = self.article.text()
detail = self.detail.text()
# ? loop = asyncio.new_event_loop()
# ? objects = loop.run_until_complete(get_data_by_condition(article, detail))
# ? loop.close()
objects = [
['Класс QScrollArea обеспечивает прокрутку другого виджета.', '', '', '', '', '',],
['https://doc.qt.io/qt-6/qscrollarea.html', '', '', '', '', '',],
['Область прокрутки используется для отображения содержимого',
'дочернего виджета внутри фрейма. Если виджет превышает размер',
'кадра, представление может содержать полосы прокрутки, чтобы можно',
'было просмотреть всю область дочернего виджета. ',
'Дочерний виджет ',
'должен быть указан с помощью setWidget(). ...'],
]
for obj in objects[:40]:
label = QLabel(f'{obj[0]} {obj[1]} {obj[2]} {obj[3]} {obj[4]} {obj[5]}')
label.setFixedHeight(20)
# self.grid_layout.addWidget(label)
self.scroll_layout_2.addWidget(label)
# --------> ^^^^^^^^^^^^^^^^^^^^ <------------------------------------------- # !!!
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold))
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
window = Window()
#? window.setFixedSize(QSize(900, 400))
window.resize(900, 400)
window.show()
sys.exit(app.exec())


