Пользовательские виджеты как элементы в ListView - PullRequest
0 голосов
/ 26 октября 2018

Я просто хочу написать приложение для чата и реализовать список сообщений в ListView, поэтому - концепция сообщений

Но я понятия не имею, как это сделатьтак как адаптер списка в kivy может принимать только элементы ListItemButton или ListItemLabel из списка.Он не принимает тип моих пользовательских классов и даже простой BoxLayout. Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Для этого вы можете использовать RecycleView .

RecycleView предоставляет гибкую модель для просмотра выбранных разделов больших наборов данных. Он направлен на предотвращение снижения производительности, которое может возникнуть при создании большого количества виджетов для отображения множества элементов данных.

Используется ...

... предписывает генерировать экземпляры класса просмотра как требуется

и viewclass это означает ваш собственный виджет элемента списка.

0 голосов
/ 26 октября 2018

Прежде всего вы больше не используете ListView, так как он устарел, kivy рекомендует использовать RecycleView, концепция похожа на ListView, есть поле данных, которое представляет собой список словарей, где словарь - это свойства, которые виджетиспользует представление получает для создания каждого элемента.

Предполагая, что пользовательский виджет уже имеет его, вы должны предоставить все свойства, которые могут быть изменены списком, в примере есть 3 свойства: source_image, titleи сообщение.

from kivy.app import App
from kivy.base import runTouchApp

from kivy.lang import Builder
from kivy.uix.recycleview import RecycleView

Builder.load_string('''

<CustomWidget@BoxLayout>:

    source_image: ""
    title: ""
    message: ""

    orientation: 'horizontal'
    Image:
        source: root.source_image
        size_hint_x: 1
    BoxLayout:
        size_hint_x: 2
        orientation: 'vertical'
        Label:
            text: root.title
            size: self.texture_size
            size_hint_y: None
        Label:
            text: root.message

<View>:
    viewclass: 'CustomWidget'
    RecycleBoxLayout:
        default_size: None, dp(56)
        default_size_hint: 1, None
        size_hint_y: None
        height: self.minimum_height
        orientation: 'vertical'
''')

class View(RecycleView):
    def __init__(self, **kwargs):
        super(View, self).__init__(**kwargs)
        self.data = [{'source_image': "heart.png", 'title': "title{}".format(i), 'message': "message"} for i in range(100)]

if __name__ == '__main__':
    runTouchApp(View())
0 голосов
/ 26 октября 2018

Я бы посоветовал вам использовать QtWebKit для вашей программы чата, потому что она идеально подходит для использования разметки HTML в чатах - она ​​дает вам бесконечное возможность украшения чата.

Вы можете вставлять изображения с тегом image, делать текст полужирным или курсивом

Вы можете вставлять видео YouTube (и другие) с помощью tag

И все, что вам нужно:

  1. Создать экземпляр QtWebKit

  2. Внутри него поместите простой HTML-файл с функцией JavaScript, который будет обрабатывать некоторые внешние сигналы, принимать входящие данные и помещать их в html

  3. Снаружи, после получения сообщения, обернуть его в HTML и передать в QtWebKit.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...