【问题标题】:wxWidgets: How to catch left-click on wxListCtrl?wxWidgets:如何捕捉左键单击 wxListCtrl?
【发布时间】:2010-07-01 10:26:47
【问题描述】:

我想将复选框添加到 wxListCtrl,这可以正常工作,除非当鼠标单击项目时似乎没有 EVT_LIST_ITEM_CLICK 或 EVT_LIST_ITEM_LEFT_CLICK 事件来捕获,因此可以切换图像。有右键和中键单击的事件,而不是左键单击 - 这意味着您必须中键或右键单击才能勾选/取消勾选列表中的项目。

有谁知道有没有可以使用的左键事件?我尝试了 item selected 和 item activate 事件,但这些事件并没有报告事件的像素位置,所以我无法使用它们来确定图像是否是被点击的项目的一部分。

我的代码基于the wxWidgets wiki 上的一些代码,除了它们覆盖了 wxListCtrl 类,为了简单起见,我想避免使用它。我也知道 wxGrid 和其他替代控件,但没有一个比 wxListCtrl 快(而且 wxGrid 复选框看起来也很糟糕。)

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

编辑:抱歉,wxListCtrl 不是 wxListGrid(对 wxGrid 考虑太多了……)

【问题讨论】:

    标签: wxpython wxwidgets


    【解决方案1】:

    我很困惑。您应该能够像使用任何其他小部件一样绑定到 EVT_LEFT_DOWN。我刚试过,它对我有用。请参阅以下示例:

    import wx

    类 MyForm(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "列表控件教程", size=(500,500))
    
        # 添加一个面板,使其在所有平台上看起来都正确
        面板 = wx.Panel(自我,wx.ID_ANY)
        自我索引 = 0
    
        self.list_ctrl = wx.ListCtrl(面板,大小=(-1,100),
                         样式=wx.LC_REPORT
                         |wx.BORDER_SUNKEN
                         )
        self.list_ctrl.InsertColumn(0, '主题')
        self.list_ctrl.InsertColumn(1, '到期')
        self.list_ctrl.InsertColumn(2, '位置', width=125)
        self.list_ctrl.Bind(wx.EVT_LEFT_DOWN, self.onLeftClick)
    
        btn = wx.Button(panel, label="添加行")
        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)
        面板.SetSizer(大小)
    
    def add_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")
        自我索引 += 1
    
    def onLeftClick(自我,事件):
        pos = event.GetPosition()
        打印 str(pos)
    

    希望对你有帮助。


    迈克·德里斯科尔

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

    【讨论】:

    • 对不起,我看不到你在哪里打印鼠标点击的 X 和 Y 坐标?或任何其他检测鼠标是否已单击图像而不是项目上其他任何位置的方法。
    • 查看 onLeftClick 方法。用“event.GetPosition()”获取鼠标位置,用“print str(pos)”打印出来
    【解决方案2】:

    这是我第一次听说 wxListGrid,所以我不知道它有什么功能。但是一般来说,您总是可以捕捉到低级鼠标点击事件(例如EVT_LEFT_UP)并找到鼠标位置下方的项目。

    【讨论】:

    • 抱歉打错字了,应该是 wxListCtrl。我确实尝试捕获 EVT_LEFT_UP 和 EVT_LEFT_DOWN 事件,但这些事件从未由 wxListCtrl 发送,因此代码永远不会运行。
    • 你应该真正使用EVT_LIST_ITEM_SELECTED 这个类和wxGetMousePosition() 来获取鼠标位置(这与选择事件不完全相同,但应该足够接近)。
    【解决方案3】:

    以下是我从 ListCtrl 捕获的左键单击和双击事件:

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

    你可以看一个例子here

    【讨论】:

    • 感谢您的建议 - 这些是我在问题中提到的项目选择和项目激活事件,但是当我使用它们时,命令“print event.GetPosition()”显示 (0,0)对我来说,无论点击发生在哪里,所以我不能使用它们。您是否从这些事件中获得坐标?
    • 我不知道你是否可以通过这些事件获得职位。我建议编辑您的问题标题和最后一句,以明确您正在寻找左键的坐标。
    猜你喜欢
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多