切换虚拟桌面时 QMainWindow 可见性问题

QMainWindow visibility issue when switching virtual desktop

我的应用程序有一个 QSystemTrayIcon 可以在左键单击时切换 QMainWindow 可见性。

   def tray_icon_activated_cb(reason):
        if reason == QtWidgets.QSystemTrayIcon.Trigger:
            self.main_window.setVisible(not self.main_window.isVisible())
    self.activated.connect(tray_icon_activated_cb)

它工作正常,除非我在 QMainWindow 可见时切换虚拟桌面。

例如:

On virtual desktop 1, window hidden
Click
On virtual desktop 1, window visible
Click
On virtual desktop 1, window hidden
Change desktop
On virtual desktop 2, window hidden
Click
On virtual desktop 2, window visible
Click
On virtual desktop 2, window hidden
Change desktop
On virtual desktop 1, window hidden
Click
On virtual desktop 1, window visible
Change desktop
On virtual desktop 2, window hidden
Click
On virtual desktop 2, window hidden  <- wrong
Change desktop
On virtual desktop 1, window hidden
Click
On virtual desktop 1, window hidden  <-- still wrong

我只能通过重新启动应用程序才能恢复 QMainWindow。

我在上面的方法中添加了 prints 并且可以检查我们是否通过了

self.main_window.setVisible(not self.main_window.isVisible())

因为self.main_window.isVisible()returnsTrueFalse交替。

我只是不知道 哪里 QMainWindow 可见。

Debian Stretch,伴侣 1.16.2,Python 3.5.3。我可以用 PyQt4 和 PyQt5 重现。

看起来 window 在隐藏时最小化然后从另一个桌面显示,但我看不到,因为它没有出现在任务栏中,因为它有以下标志:

self.setWindowFlags(QtCore.Qt.Tool |
                    QtCore.Qt.FramelessWindowHint |
                    QtCore.Qt.WindowStaysOnTopHint)

我通过在 show 事件中显式取消最小化来解决了这个问题:

def showEvent(self, event):
    super().showEvent(event)
    # Ensure the window is not minimized on virtual desktop change
    self.showNormal()