【问题标题】:Qt/PySide: Linking the hover-highlight state of two widgetsQt/PySide:链接两个小部件的悬停高亮状态
【发布时间】:2020-02-21 02:35:30
【问题描述】:

我需要一个函数来获取两个 Qt 小部件并“链接”它们,这样无论鼠标悬停在哪个小部件上,它们都会通过(标准)悬停突出显示(如果有的话)突出显示。

这需要与调用者传递给此函数的任何类型的小部件一起使用;此函数不能要求调用者创建小部件子类只是为了使其工作。

以下是我所指的一些图片:

通常,当您将光标悬停在小部件上时,它会突出显示,如图 1 和图 2 所示。我需要一个示例来说明如何进行设置,以便无论鼠标悬停在哪个小部件上,它们都会得到用标准的悬停高亮突出显示,如图 3 所示。理想情况下,这个函数可以通用,只在其参数上作为 QWidgets 操作,不管它们实际上是什么类型的小部件(因为悬停高亮是一种通用的 Qt 行为,毕竟)。

def link_highlighting(widgetA, widgetB):

   ... what should go here? ...

这感觉会涉及一些非常黑暗的事件黑客,但我的事件黑客fu不强。

想法?有什么建议吗?

【问题讨论】:

  • 我不确定要给出什么样的例子,因为我想提供一个如何做到这一点的例子。你的意思是你想要一个在鼠标悬停期间突出显示小部件时标准 Qt 行为的图像吗?
  • 没错,我想要一个视觉示例来说明您想要什么,因为您所说的内容非常通用,可以通过多种方式进行解释。除了要求将功能应用于通用小部件而不是说它们是 QPushButton、QLineEdit 等。对于上述内容,我可能认为您有一个XY problem,您的主要目标是什么?
  • 好的,我已经用图片和一些解释性文字更新了原始消息。

标签: qt pyside


【解决方案1】:

我做了一些研究,发现现在可以通过两种通用方式完成此操作。

第一部分是检测悬停动作。这应该很容易。只需订阅这两个小部件的enterEvent 和leaveEnvent。只要它们是QWidget 类型,这将起作用。这样,当鼠标进入或离开小部件时,您将收到通知。

然后是高亮部分。这里有两种选择:

  1. 您可以在第二个小部件上伪造鼠标事件,基本上模拟第二个鼠标 enterEvent。这可以通过qApp.sendEvent(widget, event) 完成。

  2. 您可以更改第二个小部件的调色板。基本上将普通调色板设置为突出显示的调色板。在这里,您将使用以下功能:

    palette = widget.getPalette()
    palette.setColor(QPalette.Base, widget.palette().color(QPalette.Highlight))
    widget.setPalette(palette)
    

    这显然需要一些试验。目前这仅适用于与调色板一起使用的小部件样式。对于那些使用 CSS 的人,基本上需要做同样的事情。找到适用于高亮的位并将其复制到正常状态。

    根据您的案例的一般情况,这可能非常容易或非常困难。

让我知道这是怎么回事。

【讨论】:

  • “订阅”事件是什么意思?这是我对 Qt 不熟悉的命名法。另外,您是否测试过这种方法?早期向任一小部件发布虚假事件的实验均无效。就好像响应事件一样,基类代码在响应事件时验证鼠标光标是否在窗口小部件范围内,而不是依赖于随事件发送的事件数据。但这只是我的猜测。
  • 你可能是对的,那么方法1就行不通了。谢谢你让我知道,我学到了一些新东西:-) 我用 QTest 做了一些实验,但这实际上是在屏幕上移动鼠标指针。所以这不适用于鼠标移动模拟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-27
  • 2021-02-20
  • 1970-01-01
  • 2019-12-18
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多