Python 在QSystemTrayIcon中实现弹出式映射

Python 在QSystemTrayIcon中实现弹出式映射,python,pyqt,pyqt5,qsystemtrayicon,Python,Pyqt,Pyqt5,Qsystemtrayicon,我想实现一个弹出窗口的行为,就像Windows10中的默认音量控制器一样。点击图标,窗口打开或关闭;如果窗口打开,单击窗口外部将关闭窗口。我如何实现这一点 之前,我发现小部件可以覆盖按下和释放鼠标键的方法,但在这里没有找到,或者搜索不好。请帮帮我 import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QGridLayout, \ QWidget,

我想实现一个弹出窗口的行为,就像Windows10中的默认音量控制器一样。点击图标,窗口打开或关闭;如果窗口打开,单击窗口外部将关闭窗口。我如何实现这一点

之前,我发现小部件可以覆盖按下和释放鼠标键的方法,但在这里没有找到,或者搜索不好。请帮帮我

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QGridLayout, \
                            QWidget, QSystemTrayIcon, QStyle, qApp
import PyQt5.QtCore


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setMinimumSize(PyQt5.QtCore.QSize(600, 130))
        self.setMaximumSize(PyQt5.QtCore.QSize(600, 130))

        self.setWindowFlags(PyQt5.QtCore.Qt.Popup)

        screen_geometry = QApplication.desktop().availableGeometry()
        screen_size = (screen_geometry.width(), screen_geometry.height())
        win_size = (self.frameSize().width(), self.frameSize().height())
        x = screen_size[0] - win_size[0]
        y = screen_size[1] - win_size[1]
        self.move(x, y)
        self.setWindowOpacity(0.85)
        self.setWindowTitle("System Tray Application")
        central_widget = QWidget(self)
        self.setCentralWidget(central_widget)

        grid_layout = QGridLayout(central_widget)
        grid_layout.addWidget(QLabel("Application, which can minimize to tray",
                                     self), 0, 0)

        self.tray_icon = QSystemTrayIcon(self)
        self.tray_icon.setIcon(self.
                               style().standardIcon(QStyle.SP_ComputerIcon))
        self.tray_icon.activated.connect(self.trigger)
        self.tray_icon.show()

        self.setGeometry(500, 570, 600, 130)
        self.fl = False

    def trigger(self, reason):
        if reason == QSystemTrayIcon.MiddleClick:
            qApp.quit()
        elif reason == QSystemTrayIcon.Trigger:
            if not self.fl:
                self.show()
            else:
                self.hide()
            self.fl = not self.fl
        elif reason == 1:
            self.fl = False

    # def mouseReleaseEvent(self, event):
    #     self.hide()
    #     self.fl = False


if __name__ == "__main__":
    app = QApplication(sys.argv)
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec())


如果要切换可见性,则必须使用
setVisible()
isVisible()
方法:

导入系统 从PyQt5.QtWidgets导入( QApplication, QGridLayout, QLabel, QMainWindow, QStyle, QSystemTrayIcon, QWidget, ) 从PyQt5.QtCore导入Qt,QSize 类主窗口(QMainWindow): 定义初始化(自): super()。\uuuu init\uuuuu() 自设置固定大小(600130) self.setWindowFlag(Qt.Popup) self.setWindowOpacity(0.85) self.setWindowTitle(“系统托盘应用程序”) central_widget=QWidget() self.setCentralWidget(中心窗口小部件) grid_layout=QGridLayout(中心_小部件) grid_layout.addWidget(QLabel(“应用程序,可以最小化到托盘”),0,0) self.tray_图标=QSystemTrayIcon(self) self.tray_icon.setIcon(self.style().standardIcon(QStyle.SP_ComputerIcon)) self.tray_图标。已激活。连接(self.trigger) self.tray_icon.show() 自置几何( QStyle.alignedRect( Qt.LeftToRight, Qt.AlignBottom | Qt.AlignRight, self.window().size(), QApplication.desktop().availableGeometry(), ) ) def触发器(自身、原因): 如果原因==QSystemTrayIcon.MiddleClick: QApplication.quit() elif原因==QSystemTrayIcon.Trigger: self.setVisible(非self.isVisible()) 如果名称=“\uuuuu main\uuuuuuuu”: app=QApplication(sys.argv) mw=主窗口() mw.show() sys.exit(app.exec())