Здравствуйте! У меня возникла задача создать список контактов, размещённый в левой части элемента <b>QScrollArea</b>. Каждый элемент в этом прокручиваемом списке должен иметь фиксированную высоту и выстраиваться по вертикали с помощью верхнего выравнивания. Как можно реализовать эту функциональность? Вот предоставленный код: <br/> <br/> <pre><code class="python">from PySide6.QtWidgets import *
from PySide6.QtGui import *
from PySide6.QtCore import *
import sys
class Color(QWidget):
def __init__(self, color):
super(Color, self).__init__()
self.setAutoFillBackground(True)
palette = self.palette()
palette.setColor(QPalette.Window, QColor(color))
self.setPalette(palette)
class UrlImage(QLabel):
def __init__(self, url : str, *args, **kwargs):
super().__init__(*args, **kwargs)
self.image = QImage()
import requests
self.image.loadFromData(requests.get(url).content)
self.setPixmap( QPixmap.fromImage(self.image))
class UserAvatar(QWidget):
def __init__(self, contact, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setFixedSize(200, 40)
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setWindowTitle("Hello World")
self.setCentralWidget(UrlImage("https://c0.wallpaperflare.com/preview/115/811/694/simple-background-abstract-slick.jpg"))
self.contactsScroll = QScrollArea(self)
self.contactsScroll.setGeometry(2, 0, 200, self.height())
self.contactsScroll.setAttribute(Qt.WA_TranslucentBackground, True)
self.contactsScroll.setStyleSheet("background-color: rgba(0,0,0,150);")
self.contactsScroll.setLayout(QVBoxLayout())
self.show()
Чтобы создать вертикальный прокручиваемый список с элементами фиксированной высоты в PySide6, можно использовать `QScrollArea` для отображения списка и `QVBoxLayout` для выстраивания элементов. Также важно учесть, что высота самих элементов (в вашем случае это `UserAvatar`) также будет фиксированной.
Ниже представлена немного изменённая версия вашего кода с добавлением функциональности, необходимой для создания вертикального прокручиваемого списка контактов:
```python
from PySide6.QtWidgets import *
from PySide6.QtGui import *
from PySide6.QtCore import *
import sys
import requests
class UrlImage(QLabel):
def __init__(self, url: str, *args, **kwargs):
super().__init__(*args, **kwargs)
self.image = QImage()
self.image.loadFromData(requests.get(url).content)
self.setPixmap(QPixmap.fromImage(self.image))
class UserAvatar(QWidget):
def __init__(self, contact, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setFixedHeight(40) # Устанавливаем фиксированную высоту для каждого контакта
layout = QHBoxLayout()
layout.addWidget(QLabel(contact)) # Замените на соответствующий виджет для отображения контакта
layout.setAlignment(Qt.AlignLeft)
self.setLayout(layout)
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setWindowTitle("Hello World")
# Устанавливаем фоновое изображение
self.setCentralWidget(UrlImage("https://c0.wallpaperflare.com/preview/115/811/694/simple-background-abstract-slick.jpg"))
# Создаем область прокрутки
self.contactsScroll = QScrollArea(self)
self.contactsScroll.setGeometry(2, 0, 200, 600) # Замените высоту на требуемую
self.contactsScroll.setWidgetResizable(True) # Позволяем содержимому адаптироваться под размер области прокрутки
# Создаем виджет для размещения содержимого списка
self.contactsWidget = QWidget()
self.contactsLayout = QVBoxLayout(self.contactsWidget) # Используем QVBoxLayout для вертикального размещения
# Добавляем элементы в прокручиваемый список
for i in range(20): # Задайте количество контактов
user_avatar = UserAvatar(f"Contact {i+1}")
self.contactsLayout.addWidget(user_avatar)
self.contactsWidget.setLayout(self.contactsLayout)
self.contactsScroll.setWidget(self.contactsWidget) # Устанавливаем виджет в QScrollArea
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
sys.exit(app.exec())
```
### Объяснение изменений:
1. **`UserAvatar`:** Я добавил фиксированную высоту (`self.setFixedHeight(40)`) для каждого элемента списка.
2. **`QVBoxLayout`:** Используется для размещения элементов вертикально.
3. **`QScrollArea`:** Установлен флаг `setWidgetResizable(True)`, чтобы содержимое могло адаптироваться к размеру области прокрутки. Содержимым является виджет `contactsWidget`, который содержит `QVBoxLayout`.
4. **Добавление элементов:** Я добавил цикл для создания нескольких экземпляров `UserAvatar`, представляющих контакты.
Теперь вы сможете видеть вертикальный прокручиваемый список с фиксированной высотой элементов.
Решение
from PySide6.QtWidgets import * from PySide6.QtGui import * from PySide6.QtCore import * import sys class Color(QWidget): def __init__(self, color): super(Color, self).__init__() self.setAutoFillBackground(True) palette = self.palette() palette.setColor(QPalette.Window, QColor(color)) self.setPalette(palette) class UrlImage(QLabel): ImagesLoaded = {} def __init__(self, url : str, *args, **kwargs): super().__init__(*args, **kwargs) self.image = QImage() if not self.ImagesLoaded.get(url): import requests content = requests.get(url).content self.image.loadFromData(content) self.ImagesLoaded[url] = content else: self.image.loadFromData(self.ImagesLoaded[url]) self.pixmap = QPixmap.fromImage(self.image) self.setPixmap( self.pixmap ) def resizeEvent(self, event): self.setPixmap(self.pixmap.scaled(event.size().width(), event.size().height())) class UserAvatar(QWidget): def __init__(self, contact, *args, **kwargs): super().__init__(*args, **kwargs) self.setFixedSize(200, 40) class MainWindow(QMainWindow): def resizeEvent(self, event): self.contactsScroll.setGeometry(0,0, 200, self.height()) QMainWindow.resizeEvent(self, event) def __init__(self): super(MainWindow, self).__init__() self.setWindowTitle("Hello World") self.setCentralWidget(UrlImage("https://c0.wallpaperflare.com/preview/115/811/694/simple-background-abstract-slick.jpg")) self.contactsScroll = QScrollArea(self) self.contactsScroll.setStyleSheet("""background-color: rgba(0,0,0,0); """) layout = QVBoxLayout() layout.setContentsMargins(0,0,0,0) layout.setSpacing(0) self.contactsScroll._layout = layout for i in range (10): self.addContact("NICKNAME", "https://www.svgrepo.com/show/384674/account-avatar-profile-user-11.svg", "SERVICE_NAME", "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSpJ27FVfkM_2ubo4TV6iQXfET93AFER9M6xA&s") self.addContact("NICKNAME", "https://www.svgrepo.com/show/384674/account-avatar-profile-user-11.svg", "SERVICE_NAME", "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSpJ27FVfkM_2ubo4TV6iQXfET93AFER9M6xA&s") self.addContact("NICKNAME", "https://img.freepik.com/premium-vector/professional-male-avatar-profile-picture-employee-work_1322206-66590.jpg", "SERVICE_NAME", "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR8aMugg7LWDXqkWc-9JlApM4MLPXhi-EPDYA&s") self.show() def addContact(self, nickname : str, avatar_url : str, service_name : str, service_url : str) -> None: widget = QWidget() widget.setGeometry(0,0,200, 50) widget.setFixedHeight(50) widget.setFixedWidth(200) widget.setStyleSheet("""background-color: rgba(0,0,0,155)""") labelNickname = QLabel(nickname, parent=widget) labelNickname.move(widget.height(), 0) avatar = UrlImage(avatar_url, parent=widget) avatar.resize(widget.height(), widget.height()) avatar.setStyleSheet("background-color: rgba(0,0,0,0)") serviceImage = UrlImage(service_url, parent=avatar) serviceImage.resize(avatar.width() / 2, avatar.height() / 2) serviceImage.move(avatar.width() / 2, avatar.height() / 2) self.contactsScroll._layout.addWidget(widget) self.contactsScroll._layout.addStretch() widget2 = QWidget() widget2.setLayout(self.contactsScroll._layout) self.contactsScroll.setWidget(widget2) if __name__ == "__main__": app = QApplication(sys.argv) w = MainWindow() app.exec()