PyQt5 浮窗应用显示传递的信息,实现始终置顶、可以拖动、动态调整大小、无法关闭和隐藏任务栏图标

时间:2025-05-10 07:19:54
import sys from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout, QPushButton, QSystemTrayIcon, QMenu, QAction from PyQt5.QtCore import Qt class FloatingWindow(QWidget): def __init__(self): super(FloatingWindow, self).__init__() # 设置浮窗样式 self.setWindowFlags(Qt.Window | Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint) self.setAttribute(Qt.WA_TranslucentBackground) self.setAttribute(Qt.WA_DeleteOnClose) # 初始化内容 self.label = QLabel("这是一个浮窗示例\n可以拖动和调整透明度", self) self.label.setStyleSheet("background-color: rgba(255, 255, 255, 200); padding: 10px;") self.label.setAlignment(Qt.AlignCenter) # 布局 layout = QVBoxLayout(self) layout.addWidget(self.label) self.setLayout(layout) # 设置初始大小 self.adjustSize() # 隐藏任务栏图标 self.setWindowFlag(Qt.Tool) # 初始化拖动参数 self.startPos = None def update_text(self, new_text: str): """更新浮窗中的文本""" self.label.setText(new_text) self.adjustSize() # 动态调整大小 def mousePressEvent(self, event): if event.button() == Qt.LeftButton: self.startPos = event.pos() def mouseMoveEvent(self, event): if self.startPos is not None: self.move(self.pos() + event.pos() - self.startPos) def mouseReleaseEvent(self, event): self.startPos = None def keyPressEvent(self, event): if event.key() == Qt.Key_Up: current_opacity = self.windowOpacity() self.setWindowOpacity(min(current_opacity + 0.1, 1.0)) # 增加透明度 elif event.key() == Qt.Key_Down: current_opacity = self.windowOpacity() self.setWindowOpacity(max(current_opacity - 0.1, 0.0)) # 减少透明度 class MainWindow(QWidget): def __init__(self): super(MainWindow, self).__init__() # 初始化主界面 self.setWindowTitle('主程序') self.setGeometry(100, 100, 300, 200) # 按钮启动浮窗 self.button = QPushButton("启动浮窗", self) self.button.clicked.connect(self.open_floating_window) layout = QVBoxLayout(self) layout.addWidget(self.button) self.floating_window = None # 系统托盘图标 self.tray_icon = QSystemTrayIcon(self) self.tray_icon.setIcon(self.style().standardIcon(QStyle.SP_ComputerIcon)) self.tray_icon.activated.connect(self.tray_icon_clicked) # 设置菜单 self.tray_menu = QMenu() restore_action = QAction("恢复", self) restore_action.triggered.connect(self.show) quit_action = QAction("退出", self) quit_action.triggered.connect(QApplication.quit) self.tray_menu.addAction(restore_action) self.tray_menu.addAction(quit_action) self.tray_icon.setContextMenu(self.tray_menu) def open_floating_window(self): if self.floating_window is None: self.floating_window = FloatingWindow() self.floating_window.show() # 示例:传递信息到浮窗 self.floating_window.update_text("这是从主程序传来的消息!") def tray_icon_clicked(self, reason): if reason == QSystemTrayIcon.Trigger: self.show() self.raise_() # 将窗口升到最上面 def closeEvent(self, event): self.hide() # 关闭主窗口时隐藏而不是退出 self.tray_icon.show() # 在托盘中显示图标 event.ignore() # 忽略关闭事件 if __name__ == "__main__": app = QApplication(sys.argv) main_window = MainWindow() main_window.show() # 隐藏任务栏图标,运行主程序 sys.exit(app.exec_())