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

wxwidgets:如何捕获左键单击wxlistctrl?

  •  2
  • Malvineous  · 技术社区  · 14 年前

    我想将复选框添加到wxlistctrl,这很好地工作,除非似乎没有一个evt-list-item-click或evt-list-item-left-click事件在鼠标单击该项时捕获,以便可以切换图像。有右键和中键单击的事件,而不是左键单击-这意味着您必须中键或右键单击以勾选/取消勾选列表中的项目。

    是否有人知道您是否可以使用左键单击事件?我尝试了项目选择和项目激活事件,但这些事件不会报告事件的像素位置,因此我无法使用它们来确定图像是否是单击项目的一部分。

    我把代码建立在 the wxWidgets wiki ,但为了简单起见,它们重写了我想要避免的wxlistctrl类。我也知道wxgrid和其他替代控件,但它们都不如wxlistctrl(wxgrid复选框也很糟糕)。

    那么,有人知道如何在wxlistctrl中获取左键单击的坐标吗?

    编辑:抱歉,wxlistctrl不是wxlistgrid(对wxgrid考虑太多…)

    3 回复  |  直到 14 年前
        1
  •  0
  •   VZ.    14 年前

    这是我第一次听说wxlistgrid,所以我不知道它能做什么。但是,一般情况下,您总是可以捕获低级鼠标单击事件(例如 EVT_LEFT_UP )找到鼠标位置下的项目。

        2
  •  2
  •   Mike Driscoll    14 年前

    我搞糊涂了。您应该能够像使用任何其他小部件一样,直接绑定到evt-left-down。我刚试过,它对我有用。请参见以下示例:

    import wx

    MyForm类(wx.frame):

    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "List Control Tutorial", size=(500,500))
    
        # Add a panel so it looks the correct on all platforms
        panel = wx.Panel(self, wx.ID_ANY)
        self.index = 0
    
        self.list_ctrl = wx.ListCtrl(panel, size=(-1,100),
                         style=wx.LC_REPORT
                         |wx.BORDER_SUNKEN
                         )
        self.list_ctrl.InsertColumn(0, 'Subject')
        self.list_ctrl.InsertColumn(1, 'Due')
        self.list_ctrl.InsertColumn(2, 'Location', width=125)
        self.list_ctrl.Bind(wx.EVT_LEFT_DOWN, self.onLeftClick)
    
        btn = wx.Button(panel, label="Add Line")
        btn.Bind(wx.EVT_BUTTON, self.add_line)
    
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.list_ctrl, 0, wx.ALL|wx.EXPAND, 5)
        sizer.Add(btn, 0, wx.ALL|wx.CENTER, 5)
        panel.SetSizer(sizer)
    
    def add_line(self, event):
        line = "Line %s" % self.index
        self.list_ctrl.InsertStringItem(self.index, line)
        self.list_ctrl.SetStringItem(self.index, 1, "01/19/2010")
        self.list_ctrl.SetStringItem(self.index, 2, "USA")
        self.index += 1
    
    def onLeftClick(self, event):
        pos = event.GetPosition()
        print str(pos)
    

    希望有帮助。


    迈克·德里斯科尔

    博客: http://blog.pythonlibrary.org

        3
  •  0
  •   minou    14 年前

    以下是我从listcrl中捕获的用于左键单击和双击的事件:

    self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnListClick, self.ballotC)
    self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnListDClick, self.ballotC)
    

    你可以看到一个例子 here .