Qt:在macOS上打开外部链接后,悬停不起作用



这重现了QML和QWidget的,但我的例子是在QML中。

所以这里有一个例子:

import QtQuick 2.7
import QtQuick.Controls 1.4
ApplicationWindow {
id: rootWindow
visible: true
width: 640
height: 480
color: "gold"
ListView {
width: parent.width
height: parent.height / 2 * 3
model: 5
spacing: 1
delegate: Rectangle {
width: parent.width
height: 50
color: ma.containsMouse ? "mediumvioletred" : "mintcream"
border.color: "black"
border.width: 1
Text {
anchors.centerIn: parent
text: "Click on me to open google.com"
font.bold: true
}
MouseArea {
id: ma
anchors.fill: parent
onClicked: Qt.openUrlExternally("https://www.google.com/");
hoverEnabled: true
}
}
}
Text {
width: parent.width
height: 200
anchors.bottom: parent.bottom
color: "black"
text: "1. Click on any list element (note color when hovered)n2. Re-gain focus by click outside of the list (gold color area)n3. Hover list element";
font.bold: true
horizontalAlignment: Qt.AlignHCenter
verticalAlignment: Qt.AlignVCenter
}
}

执行以下操作:

  1. 单击列表元素以在浏览器中打开外部链接
  2. 返回到示例应用,然后在列表外部单击(金色区域)
  3. 在此之后,立即尝试悬停列表元素

结果 - 悬停停止工作一段时间。

同样,如果用QWidget编写,它会重现相同的内容。 我的操作系统是MacOS 10.12.6

是错误还是可以修复的东西?

我不认为这是一个错误! 此外,在Windows和Linux上都没有观察到它。

在MacOS中,新打开的应用程序"从正在运行的应用程序中窃取鼠标焦点";此外,"焦点不跟随鼠标行为!">这在博客中进行了广泛的讨论 解决OS X焦点跟随鼠标的争论

顺便说一句,关于您的观察..即(在黄金区域内按下后悬停工作一段时间)..您可能只是被欺骗了,因为我注意到悬停永远不会恢复,直到:

  • 按窗口内(金色区域)将其置于前台,然后将鼠标悬停在窗口并返回以重新获得鼠标焦点。 或者,
  • 通过按窗口栏直接将窗口和焦点置于前台。

再次发表另一篇博客 在OS X中打开时防止应用程序窃取焦点 确认了这个问题并提出了一些的解决方法,例如以不同的方式在后台启动子应用程序,但我认为这不是您的选择,因为您不想修改浏览器的Info.plist

我能做的是通过将窗口带回前台(再次hide()show())来消除问题,这似乎有效并带回被盗的鼠标焦点,我同意这听起来不像一个解决方案,但它而是确认了 Mac 行为的概念,它不是一个错误, 您可以通过向黄金区域添加鼠标区域来观看此操作:

Text {
width: parent.width
height: 200
anchors.bottom: parent.bottom
color: "black"
text: "1. Click on any list element (note color when hovered)n2. Re-gain focus by click outside of the list (gold color area)n3. Hover list element";
font.bold: true
horizontalAlignment: Qt.AlignHCenter
verticalAlignment: Qt.AlignVCenter
MouseArea{
anchors.fill: parent
onClicked: {
rootWindow.hide()
rootWindow.show()
}
}
}

现在,当您在黄金区域内按下悬停时,悬停就像以前一样。

注意:mouseareapreventStealing :属性似乎没有帮助,因为鼠标焦点位于应用外部,而此属性在应用的元素中工作。

最新更新