Задать вопрос

Как сделать вертикальный прокручиваемый список из элементов с ограниченной высотой?

задача сделать список контактов в левой части элемента QScrollArea, каждый элемент прокручиваемого списка должен быть фиксированной высоты и опираться при заполнении на верх. Как это сделать? Вот код

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()

        self.addContact("NICKNAME", "{URL}", "SERVICE_NAME", "SERVICE_URL")

    def addContactItem(self, contact): 
        self.contactsScroll.addScrollBarWidget(UserAvatar(contact))

    def addContact(self, nickname : str, avatar_url : str, service_name : str, service_url : str) -> None:
        widget = QWidget(self.contactsScroll)
        
        self.contactsScroll.layout().addWidget(widget)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MainWindow()
    app.exec()
  • Вопрос задан
  • 70 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
Pauk_Code
@Pauk_Code Автор вопроса
Решение

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()
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы