如何继承GObjectclass?

How to inherit from GObject class?

我想在 中编写带有树视图小部件的应用程序 我将存储 class 'Item' 的对象。

我知道要这样做,我的 'Item' class 必须继承自 GObject class。不幸的是出了点问题,我没有在我的树上看到项目的文本。我只收到此警告:

Warning: unable to set property 'text' of type 'gchararray' from value of type '__main__+Item'

我需要做什么来解决这个问题?

此示例程序演示了问题并准备测试修复:

#!/usr/bin/env python3

from gi.repository import Gtk
from gi.repository import GObject


class Item(GObject.GObject):
    text = GObject.property(type=str, default='item', flags=GObject.PARAM_READWRITE)

    def __init__(self, title):
        GObject.GObject.__init__(self)
        self.__title = title

    def __str__(self):
        return self.__title

GObject.type_register(Item)


class MainWindow(Gtk.Window):
    def __init__(self):
        super().__init__(Gtk.WindowType.TOPLEVEL)
        self.connect('destroy', self.on_destroy)
        tree_model = Gtk.TreeStore(Item.__gtype__)
        # tree_model = Gtk.TreeStore(str)
        text_renderer = Gtk.CellRendererText()
        text_column = Gtk.TreeViewColumn(None, text_renderer)
        text_column.add_attribute(text_renderer, 'text', 0)
        tree_view = Gtk.TreeView(tree_model)
        tree_view.append_column(text_column)
        self.add(tree_view)
        self.show_all()
        tree_model.append(None, (Item('test'),))
        # tree_model.append(None, ('It works!',))

    def on_destroy(self, e):
        Gtk.main_quit()


if __name__ == '__main__':
    MainWindow()
    Gtk.main()

GtkCellRendererTexttext 属性 需要字符串 (gchararray) 数据,并且它正在接收自定义 GObject 值。 __str__ 函数在 Python 级别上工作,并且永远不会被 GObject 调用。

幸运的是,您想要实现的目标不需要子类化 GObject。您需要执行以下操作:

  • 将树存储列指定为GObject.TYPE_PYOBJECT。这将允许您将实例附加到树存储,而无需继承 GObject 或特殊属性。

  • 在树视图列上使用 set_cell_data_func 从存储在模型中的实例中提取文本数据。

有关此技术的工作示例,请参阅 this answer