首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在自定义CellRenderer上检测鼠标位置

如何在自定义CellRenderer上检测鼠标位置
EN

Stack Overflow用户
提问于 2016-03-13 09:00:40
回答 1查看 229关注 0票数 1

有一段时间,我一直在努力检测自定义Gtk.CellRenderer上的鼠标坐标。

我一直在读一些好的文档,比如:

但我还是不知道该怎么做。我尝试过很多事情,比如尝试将信号连接到__gsignals__,或者尝试使用虚拟方法。

我需要这样做,因为我正在构建一个评级小部件。raiting小部件包含的启动方式包括:★★★★★和我希望当用户将鼠标移到上面时,相对的x位置会修改启动的次数。

我还想连接一个clicked信号,以保存用户选择的启动次数。

下面是我目前的工作代码。在这方面的任何帮助都是非常感谢的!

代码语言:javascript
复制
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('PangoCairo', '1.0')
from gi.repository import Gtk, Gdk, cairo, Pango, PangoCairo, GObject

class CellRendererRating(Gtk.CellRenderer):
    """ Cellrenderer to display ratings from 0 to 5: ★★★★★, ★★★☆☆, etc """

    __gproperties__ = {
        'rating': ( int, # type
                    "integer prop", # nick
                    "A property that contains an integer", # blurb
                    0, # min
                    5, # max
                    0, # default
                    GObject.PARAM_READWRITE # flags
                    ),
    }

    def __init__(self):
        super().__init__()
        self.font_size=15
        self.font="Sans Bold {}".format(self.font_size)
        self.rating = 0

    def activate(event, widget, path, background_area, cell_area, flags):
        print(path)

    def do_set_property(self, pspec, value):
        setattr(self, pspec.name, value)

    def do_get_property(self, pspec):
        return getattr(self, pspec.name)

    def do_get_size(self, widget, cell_area):
        return (0, 0, self.font_size*5, self.font_size+5)

    def do_start_editing(event, widget, path, background_area, cell_area, flags):
        print('called')

    def do_render(self, cr, treeview, background_area, cell_area, flags):
        cr.translate (0, 0)
        layout = PangoCairo.create_layout(cr)
        #layout.set_font_description(FONT_CELLRATING_DESCRIPTION)

        if 'GTK_CELL_RENDERER_FOCUSED' in str(flags) and self.rating < 5:
            for i in range(5):
                if i < self.rating:
                    layout.set_text("★", -1)
                else:
                    layout.set_text("☆", -1)

                cr.save()
                PangoCairo.update_layout (cr, layout)
                cr.move_to (cell_area.x+i*(self.font_size+1), cell_area.y)
                PangoCairo.show_layout (cr, layout)
                cr.restore()

        else:
            for i in range(self.rating):
                layout.set_text("★", -1)
                cr.save()
                PangoCairo.update_layout (cr, layout)
                cr.move_to (cell_area.x+i*(self.font_size+1), cell_area.y)
                PangoCairo.show_layout (cr, layout)
                cr.restore()

GObject.type_register(CellRendererRating)


if __name__ == '__main__':


    class Window(Gtk.Window):
        def __init__(self):
            Gtk.Window.__init__(self)
            self.connect('destroy', self.on_quit)

            liststore = Gtk.ListStore(int)

            for i in range(6):
                liststore.append([i])


            treeview = Gtk.TreeView(liststore)

            treeviewcolumn = Gtk.TreeViewColumn("Rating")
            treeviewcolumn.set_resizable(True)
            cellrenderer = CellRendererRating()
            treeviewcolumn.pack_start(cellrenderer, True)
            treeviewcolumn.add_attribute(cellrenderer, 'rating', 0)
            treeview.append_column(treeviewcolumn)

            self.add(treeview)
            self.show_all()

        def on_quit(self, widget, data=None):
            Gtk.main_quit()

    w = Window()
    Gtk.main()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-14 08:56:50

通过执行以下操作,可以获得光标在CellRenderer上的位置:

代码语言:javascript
复制
def do_render(self, cr, treeview, background_area, cell_area, flags):
    mouse_x, mouse_y = treeview.get_pointer()
    cell_render_x = mouse_x - cell_area.x
    cell_render_y = mouse_y - cell_area.y

然而,这可能不是您的问题的最佳解决方案,因为已经有一个评级-CellRenderer,它做的正是您想要做的事情,即RB.CellRendererRating。我建议您使用它们的实现,或者将其作为自定义版本的基础。

RB.CellRendererRating.new() 创建一个单元格渲染器,它将显示一些像素以表示歌曲的评等。它还能够更新评级。

RB.CellRendererRating

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35968414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档