自定义小部件作为ListView中的元素

时间:2018-10-26 12:25:21

标签: python kivy

我只想编写一个聊天室应用程序,并想在ListView中实现消息列表-消息概念

但是我不知道该怎么做,因为在kivy上,列表适配器只能接受列表的ListItemButton或ListItemLabel元素。他不接受我的自定义类的类型,甚至不接受简单的BoxLayout。提前感谢您。

3 个答案:

答案 0 :(得分:1)

首先,由于不再使用ListView,因此不再使用它,kivy建议使用RecycleView,其概念类似于ListView,其中有一个数据字段,它是一个字典列表,其中字典是该小部件所具有的属性使用视图接收来创建每个项目。

假设自定义窗口小部件已经具有它,那么您必须公开可以由列表修改的所有属性,在该示例中,有3个属性:source_image,title和message。

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

答案 1 :(得分:0)

我建议您在聊天程序中使用QtWebKit,因为在聊天中使用HTML标记是理想的-它为您提供无限装饰聊天消息的可能性。

您可以嵌入带有标签的图像,使文本粗体斜体

您可以嵌入带有

您所需要的是:

  1. 创建QtWebKit实例

  2. 在其中放入带有JavaScript函数的简单html文件,该文件将处理一些外部Signal,将入站数据放入html

  3. 在外部,消息到达后,将其包装为HTML,然后传递给QtWebKit。

答案 2 :(得分:0)

您可以使用RecycleView

  

RecycleView提供了一个灵活的模型,用于查看大型数据集的选定部分。它旨在防止在生成大量小部件以显示许多数据项时可能发生的性能下降。

它使用...

  

...可以根据需要生成视图类的实例

viewclass表示您的自定义列表项小部件。