【问题标题】:How to receive scrollbar mouse events for QGraphicsView如何接收 QGraphicsView 的滚动条鼠标事件
【发布时间】:2016-05-30 11:10:24
【问题描述】:

在 qt 小部件QGraphicsView 我想检测鼠标按下、鼠标释放和鼠标移动事件。 我从QGraphicsView 派生了一个类,并重写了以下函数:

  • mousePressEvent(QMouseEvent *event)
  • mouseReleaseEvent(QMouseEvent *event)
  • mouseMoveEvent(QMouseEvent *event)

现在我几乎可以在任何地方检测到这些鼠标事件,除了滚动条所在的区域,它是QGraphicsView 的一部分。 我希望能够捕获这些事件并手动移动滚动条。

编辑:
我正在尝试在 Windows 环境中模拟第二只鼠标发送 WM_LBUTTONDOWN,... 事件。我希望能够检测到QGraphicsView 中滚动条的此事件。 除了检测事件之外,我还想知道 event->x() 和 event->()y 的位置。

【问题讨论】:

    标签: c++ qt mouseevent


    【解决方案1】:

    QGraphicsView 继承 QAbstractScrollArea 类。因此可以使用QAbstractScrollArea::verticalScrollbarQAbstractScrollArea::horizontalScrollbar 方法访问滚动条小部件。

    一旦您可以访问滚动条对象,您甚至不必使用事件过滤器,因为 QScrollBar 继承了 QAbstractSlider 并因此提供了信号:

    QAbstractSlider::sliderPressed()
    QAbstractSlider::sliderReleased()
    

    所以您可以将它们连接到您的插槽,例如:

    connect(horizontalScrollBar(), SIGNAL(sliderPressed()), this, SLOT(doSomething()));
    connect(horizontalScrollBar(), SIGNAL(sliderReleased()), this, SLOT(doSomething()));
    

    如果您需要事件的位置,则必须使用事件过滤器。您可以在小部件对象上安装事件过滤器。

    【讨论】:

    • 实施您的建议,我现在可以检测到这些事件。我还想获得特定事件的 x 和 y 位置,以便能够手动移动滚动条。我还想在手动发送 WM_LBUTTONDOWN,... windows 消息时检测事件(我正在尝试模拟第二只鼠标)。这对于 QGraphicsView 的其他部分是可能的。我将编辑原始问题。
    • @ŽigaGolob :你需要展示你的努力和你迄今为止所做的尝试。这不是人们为您提供现成代码的网站。
    • 我在原始问题中解释了我尝试过的内容。我还在阅读 Qt 文档以了解为什么这不适用于滚动条,滚动条是 QGraphicsView 小部件的一部分,以及覆盖滚动条的鼠标事件处理程序的正确方法是什么。我尝试了你的建议,它可以检测这些事件,但它不适合我,因为我想捕捉这些事件,特别是 mousePress、mouseRelease 和 mouseMove 事件。
    • 尝试在滑块对象上安装事件过滤器。
    • 安装事件过滤器完成了工作并回答了原始问题。我仍然无法检测到手动发送的 windows WM_LBUTTONDOWN 和其他消息,但这是另一回事。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多