PyQt5 浮窗应用显示传递的信息,实现始终置顶、可以拖动、动态调整大小、无法关闭和隐藏任务栏图标
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_())