代码之家  ›  专栏  ›  技术社区  ›  Matthew

在GTK中,如何根据x和y坐标从已排序的树视图中获取路径?

  •  2
  • Matthew  · 技术社区  · 16 年前

    我有一个ListStore,它被过滤然后排序。看起来像这样:

    // Create a model for the cards
    cardListStore = new ListStore (typeof (Card));
    
    // Set up the tree view
    cardFilter = new TreeModelFilter (cardListStore, null);
    cardFilter.VisibleFunc = new TreeModelFilterVisibleFunc (FilterCards);
    cardSort = new TreeModelSort (cardFilter);
    cardTreeView.Model = cardSort;
    

    当我右键单击每一行时,我希望有一个特定的“获取上下文”菜单。我的单击处理程序如下所示:

    [GLib.ConnectBeforeAttribute]
    void HandleCardTreeViewButtonPressEvent (object o, ButtonPressEventArgs args)
    {
        if (args.Event.Button != 3)
            return;
    
        TreePath path;
        // If right click on empty space
        if (!cardTreeView.GetPathAtPos (Convert.ToInt32 (args.Event.X),
                                        Convert.ToInt32 (args.Event.Y),
                                        out path)) {
            MakeCardEmptySpaceContextMenu ().Popup ();
            return;
        }
    
        TreeIter iter;
        if (!cardListStore.GetIter (out iter, path))
            return;
    
        Card card = (Card) cardListStore.GetValue (iter, 0);
    
        MakeCardContextMenu (card, iter).Popup ();
    }
    

    当liststore未被筛选或排序时,此操作有效。但如果是这样的话,那就错了。

    例如,在对行进行排序之前,假设它们看起来像这样:

    一
    乙
    C

    分类后,它们看起来像这样:

    乙
    一
    C

    右键单击第二行(“A”)将显示“B”,因为这是B在模型排序之前所在的位置。过滤也会发生同样的事情。假设过滤后的模型如下所示:

    一
    C

    右键单击第二行(“C”)仍将显示“B”。

    你知道怎么解决这个问题吗?

    2 回复  |  直到 13 年前
        1
  •  2
  •   Matthew    16 年前

    我只需要从cardsort获取iter和值,而不是cardliststore。

    if (!cardListStore.GetIter (out iter, path))
        return;
    
    Card card = (Card) cardListStore.GetValue (iter, 0);
    

    变成

    if (!cardSort.GetIter (out iter, path))
        return;
    
    Card card = (Card) cardSort.GetValue (iter, 0);
    
        2
  •  0
  •   Andrew    16 年前

    看起来在您和数据之间有一个过滤器,这就是树显示的内容。您正在查看树后面的数据…

    现在,我对GTK不太熟悉,但可能有点像

    TreeModelSort.convert_path_to_child_path ?
    

    必须有一种方法来获取您正在查看的模型视图的哪一行,然后将其转换回实际的模型数据。

    推荐文章