欢迎光临UUpython
最大、最新、最全的Python代码收集站

[GUI]编写一个桌面便签应用

这段代码使用PyQt5库创建了一个圆角窗口应用,具有以下功能:

  1. 窗口圆角效果:窗口的外边框为圆角,可以自定义圆角的半径。
  2. 系统托盘图标:应用可以最小化到系统托盘,并在托盘中显示图标。
  3. 托盘右键菜单:点击托盘图标后可以弹出右键菜单,包括退出应用选项。
  4. 拖拽移动窗口:按住鼠标左键拖动窗口可以改变窗口的位置。
  5. 窗口按钮:在窗口左上角有三个圆形按钮,分别是关闭、最小化和最大化(实际为灰色,无功能)。
  6. 文本编辑框:窗口中间部分为一个文本编辑框,可以输入文本内容并保存到文件。
  7. 字体大小调整:可以通过Ctrl + 鼠标滚轮来调整文本编辑框中的字体大小。
  8. 窗口最小化到托盘:关闭窗口时会最小化到托盘,通过托盘图标可以恢复窗口显示。

代码使用QMainWindow作为主窗口,自定义了窗口外观,圆角效果使用了paintEvent方法绘制半透明背景以及关闭、最小化、最大化按钮。鼠标事件处理方法实现了窗口的移动、拖动调整大小、以及关闭、最小化功能。通过QSystemTrayIcon和系统托盘交互,实现窗口最小化到托盘,以及在托盘中显示菜单和图标。此外,通过调用setFont方法来实现文本编辑框中字体大小的调整。

在运行之前,确保已经安装了PyQt5库,并准备了noteIcon.png图标文件。需要注意,系统托盘功能在不同操作系统中可能有不同的表现,可能会受到系统设置的影响。

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QMenu, QAction, QSystemTrayIcon, QMessageBox, QTextEdit
from PyQt5.QtCore import Qt, QPoint, QRect, QSize
from PyQt5.QtGui import QPainter, QColor, QBrush, QPen, QIcon, QFont, QCursor
 
class RoundedWindow(QMainWindow):
    def __init__(self, radius):
        super().__init__()
        self.setWindowFlags(Qt.FramelessWindowHint)
        self.setAttribute(Qt.WA_TranslucentBackground)
        self.setGeometry(700, 400, 400, 300)
        self.radius = radius
        self.draggable = False
        self.drag_position = QPoint()
        self.default_font_size = 13
        self.current_font_size = self.default_font_size
        self.resizing = False
 
        # 创建系统托盘图标
        self.tray_icon = QSystemTrayIcon(self)
        self.tray_icon.setIcon(QIcon("noteIcon.png"))
        self.tray_icon.activated.connect(self.handleTrayIconActivated)
 
        # 创建鼠标右键菜单
        self.tray_menu = QMenu(self)
        exit_action = QAction("退出", self)
        exit_action.triggered.connect(QApplication.instance().quit)
        self.tray_menu.addAction(exit_action)
        self.tray_icon.setContextMenu(self.tray_menu)
 
        # 创建文本编辑框
        self.text_edit = QTextEdit(self)
        self.text_edit.setGeometry(10, 40, self.width() - 20, self.height() - 50)
        self.text_edit.setStyleSheet("background-color: transparent; border: none; color: white;")
        self.text_edit.setFont(QFont("Arial", self.current_font_size))
        self.text_edit.textChanged.connect(self.saveTextToFile)
 
    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing)
        painter.setBrush(QColor(0, 0, 0, 150))  # 设置半透明背景颜色
        painter.drawRoundedRect(self.rect(), self.radius, self.radius)
 
        # 绘制红色关闭按钮
        close_button = QRect(10, 10, 20, 20)
        painter.setBrush(QColor(255, 0, 0))
        painter.setPen(Qt.NoPen)
        painter.drawEllipse(close_button)
 
        # 绘制黄色最小化按钮
        minimize_button = QRect(40, 10, 20, 20)
        painter.setBrush(QColor(255, 255, 0))
        painter.setPen(Qt.NoPen)
        painter.drawEllipse(minimize_button)
 
        # 绘制灰色最大化按钮
        maximize_button = QRect(70, 10, 20, 20)
        painter.setBrush(QColor(128, 128, 128))
        painter.setPen(Qt.NoPen)
        painter.drawEllipse(maximize_button)
 
    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.draggable = True
            self.drag_position = event.globalPos() - self.frameGeometry().topLeft()
            event.accept()
 
            # 判断点击的按钮
            pos = event.pos()
            if QRect(10, 10, 20, 20).contains(pos):
                self.close()  # 关闭当前窗口
            elif QRect(40, 10, 20, 20).contains(pos):
                self.hide()  # 最小化当前窗口
 
    def mouseMoveEvent(self, event):
        if event.buttons() == Qt.LeftButton and self.draggable:
            self.move(event.globalPos() - self.drag_position)
            event.accept()
 
        # 检查是否在窗口右下角,设置鼠标形状
        if self.isInBottomRightCorner(event.pos()):
            self.setCursor(Qt.SizeFDiagCursor)
        else:
            self.setCursor(Qt.ArrowCursor)
 
        # 检查是否正在调整窗口大小
        if self.resizing:
            self.resizeWindow(event.globalPos())
 
    def mouseReleaseEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.draggable = False
            self.resizing = False
            event.accept()
 
    def handleTrayIconActivated(self, reason):
        if reason == QSystemTrayIcon.Trigger:
            self.showNormal()  # 点击托盘图标恢复窗口显示
 
    def closeEvent(self, event):
        self.hide()  # 窗口关闭时隐藏而不是退出应用程序
        self.tray_icon.show()  # 显示系统托盘图标
        event.ignore()  # 忽略窗口关闭事件
 
    def saveTextToFile(self):
        text = self.text_edit.toPlainText()
        with open("bianqian.txt", "w") as file:
            file.write(text)
 
    def isInBottomRightCorner(self, pos):
        window_rect = self.rect()
        corner_rect = QRect(window_rect.bottomRight() - QPoint(20, 20), QSize(20, 20))
        return corner_rect.contains(pos)
 
    def resizeWindow(self, pos):
        new_size = QSize(pos.x() - self.geometry().left(), pos.y() - self.geometry().top())
        self.resize(new_size)
 
    def wheelEvent(self, event):
        if event.modifiers() == Qt.ControlModifier:
            delta = event.angleDelta().y()
            if delta > 0:
                self.increaseFontSize()
            else:
                self.decreaseFontSize()
 
    def increaseFontSize(self):
        self.current_font_size += 1
        self.text_edit.setFont(QFont("Arial", self.current_font_size))
 
    def decreaseFontSize(self):
        if self.current_font_size > 1:
            self.current_font_size -= 1
            self.text_edit.setFont(QFont("Arial", self.current_font_size))
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    radius = 15  # 修改圆角的值
    window = RoundedWindow(radius)
    window.show()
 
    # 调试:检查系统托盘是否可用
    if not QSystemTrayIcon.isSystemTrayAvailable():
        QMessageBox.critical(None, "错误", "系统托盘不可用!")
        sys.exit(1)
 
    # 调试:检查图标是否加载成功
    if not window.tray_icon.isSystemTrayAvailable():
        QMessageBox.critical(None, "错误", "无法加载系统托盘图标!")
        sys.exit(1)
 
    window.tray_icon.show()
    sys.exit(app.exec_())
赞(0) 打赏
未经允许不得转载:UUpython » [GUI]编写一个桌面便签应用
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!