【问题标题】:PyQt mousePressEvent - get object that was clicked on?PyQt mousePressEvent - 获取被点击的对象?
【发布时间】:2015-01-29 01:58:09
【问题描述】:

我正在使用 PyQt 和 PyQtGraph 构建一个相对简单的绘图 UI。作为其中的一部分,我有一个图形视图(pyqtgraph 的 graphicslayoutwidget),其中有用户动态添加的 PlotItems。

我想要实现的是允许用户通过双击来选择一个 PlotItem。

如果用户双击了小部件窗口中的某个位置,这很简单,但我似乎无法弄清楚如何返回单击的内容。

我的大部分搜索结果都试图为某些按钮重新实现 mousePressEvent。我已经阅读了一些有关事件过滤器的信息,但我不确定这是否是必要的解决方案。

我不确定还有哪些其他信息可能有助于回答这个问题,所以如果不清楚我在问什么,请告诉我,以便我澄清。

编辑:

重复:

pyqtgraph: When I click on a PlotItem how do I know which item has been clicked

【问题讨论】:

  • 有点击的x,y位置就够了吗?
  • 这可能与 widgetAt() 结合使用
  • 我不确定这是否真的有效。我只是取回整个小部件本身,而我需要嵌入小部件中的对象

标签: python pyqt pyqtgraph qmouseevent


【解决方案1】:

一种策略是连接到GraphicsScene.sigMouseClicked,然后询问场景鼠标光标下有哪些项目。

这应该会让你走上正轨:

import pyqtgraph as pg

w = pg.GraphicsWindow()
for i in range(4):
    w.addPlot(0, i)

def onClick(event):
    items = w.scene().items(event.scenePos())
    print "Plots:", [x for x in items if isinstance(x, pg.PlotItem)]

w.scene().sigMouseClicked.connect(onClick)

【讨论】:

  • 完美!谢谢你。搜索 GraphicsScene.sigMouseClicked 时,我也遇到了堆栈上其他人提出的几乎相同的问题。
  • 场景的items 函数似乎考虑了曲线的boundingRect 而不是它们的实际路径,以根据位置确定要返回的项目。有没有已知的治疗方法?
  • Qt 文档建议有一个 mode 参数来确定如何选择项目:doc.qt.io/qt-4.8/qgraphicsscene.html#items-3
【解决方案2】:

一个非常直接的替代方法是使用 lambda 函数:

q_label = QLabel("MyLabel)
q_label.mousePressEvent = lambda e: on_name_clicked(q_label)


def on_name_clicked(self, q_label):
    print(q_label.text())

【讨论】:

    猜你喜欢
    • 2022-08-09
    • 2016-04-07
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多