PyQt实现-答案之书

视频链接:

PyQt实现-答案之书

源码如下:

import random
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QTextEdit
from PyQt5.QtCore import QSize
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt, QPoint, QRect
from PyQt5.QtGui import QMouseEvent
from PyQt5.QtGui import QFont
from PyQt5.QtGui import QPainter, QColor
from PyQt5.QtCore import QTimer
from PyQt5.QtGui import QPalette

import json

g_alpha = 0
g_color = None
g_old_style_sheet = None

class XWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.loadconfig()
        self.load_answer()
        self.dragging = False
        # 设置窗口的标题和大小
        self.setWindowTitle('答案之书')
        self.setAttribute(Qt.WA_TranslucentBackground)

        self.setWindowFlags(Qt.FramelessWindowHint)  # 去掉窗口边框
        self.resize(self.config_data['window_width'], self.config_data['window_height'])
        self.background_pixmap = QPixmap('./docs/background.png')
        if self.background_pixmap is None:
            print('pixmap is None')
        self.input_edit = QLineEdit(self)
        # self.input_edit.setFixedSize(200, 30)  # 设置输入框的尺寸
        template = """
                    QLineEdit {{
                        border: none;
                        padding: 0;
                        background: transparent;
                        color: {color};
                        font-size: {font_size}px;
                        font-family:{font_family};
                        padding: 5px;
                    }}
                    QLineEdit:focus {{
                        border: none;
                        outline: none;
                    }}
                """
        formatted = template.format(color=self.config_data['input_font_color'],
                                    font_size=self.config_data['input_font_size'],
                                    font_family=self.config_data['input_font_family'])
        self.input_edit.setStyleSheet(formatted)
        self.input_edit.returnPressed.connect(self.handle_return_pressed)
        self.input_edit.setAlignment(Qt.AlignCenter)
        input_font = QFont()
        # input_font.setPointSize(self.config_data["input_font_size"])  # 设置字体大小为 16
        input_font.setFamily(self.config_data["input_font_family"])

        self.answer_edit = QTextEdit(self)
        self.answer_template = """
                    QTextEdit QScrollBar:vertical {{
                        subcontrol-position: top;
                        subcontrol-origin: margin;
                        height: 10px;
                    }}
                    QTextEdit {{
                        border: none;
                        padding: 0;
                        background: transparent;
                        color: rgb({color});
                        font-family: '{font_family}';
                        font-size: {font_size}px;
                        text-align: center;
                    }}
                    QTextEdit QScrollBar:horizontal {{
                        border: 1px solid black;
                        background: lightgray;
                        height: 10px;
                        subcontrol-position: left;
                        subcontrol-origin: margin;
                        width: 0px;
                    }}
                    QTextEdit:focus {{
                        border: none;
                        outline: none;
                    }}
                """
        formatted = self.answer_template.format(color=self.config_data['answer_font_rgb'],
                                                font_size=self.config_data['answer_font_size'],
                                                font_family=self.config_data['answer_font_family'])
        # print(formatted)
        self.answer_edit.setStyleSheet(formatted)
        self.answer_edit.setAlignment(Qt.AlignCenter)
        self.input_edit.setFont(input_font)

        self.position_input_box()


    def loadconfig(self):
        try:
            with open('docs/config.json', 'r', encoding='utf-8') as file:
                self.config_data = json.load(file)
            print(self.config_data)
        except FileNotFoundError:
            print("文件未找到,请检查文件路径。")
        except json.JSONDecodeError:
            print("文件内容不是有效的 JSON 格式。")
        except Exception as e:
            print(f"发生错误: {e}")


    def load_answer(self):
        lines = []
        # 打开文件并读取每一行
        with open('docs/answers.txt', 'r', encoding='utf-8') as file:
            lines = file.readlines()

        # 去掉每行的换行符
        self.answers = [line.strip() for line in lines]

    def resizeEvent(self, event):
        super().resizeEvent(event)
        # 每次窗口大小变化时重新设置输入框的位置
        super().resizeEvent(event)
        # 保持长宽比例为 1:1
        size = min(self.width(), self.height())
        self.resize(size, size)
        self.position_input_box()

    def position_input_box(self):
        # 计算输入框的位置和大小
        width = self.width()
        height = self.height()
        input_width = 300
        input_height = 200
        x = width // 2 - input_width // 2
        y = height * 3 // 5 - input_height // 2

        self.input_edit.setGeometry(QRect(QPoint(x, y), QSize(input_width, input_height)))

        output_width = 400
        output_height = 200
        ox = width // 2 - output_width // 2
        oy = height * 2 // 5 - output_height // 2

        self.answer_edit.setGeometry(QRect(QPoint(ox, oy), QSize(output_width, output_height)))
        self.answer_edit.setAlignment(Qt.AlignRight)

    def paintEvent(self, event):
        painter = QPainter(self)
        # 绘制背景图片,保持图片与窗口大小一致
        painter.drawPixmap(self.rect(), self.background_pixmap)

    def mousePressEvent(self, event: QMouseEvent):
        print('mouse press')
        if event.button() == Qt.LeftButton:
            print("is left")
            # 计算中心点
            center = self.rect().center()
            print(self.rect().center())
            # 检查点击位置是否在中心区域
            if (self.rect().center() - event.pos()).manhattanLength() < 111150:
                print("chengli ")
                self.dragging = True
                self.drag_start_position = event.globalPos()  # 保存点击位置

    def mouseMoveEvent(self, event: QMouseEvent):
        if self.dragging:
            # 计算拖动距离
            delta = event.globalPos() - self.drag_start_position
            self.move(self.pos() + delta)
            self.drag_start_position = event.globalPos()  # 更新起始位置

    def mouseReleaseEvent(self, event: QMouseEvent):
        if event.button() == Qt.LeftButton:
            self.dragging = False
            
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = XWidget()
    window.show()
    sys.exit(app.exec_())

本小程序已被多个主播使用
长期接各种编码需求

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值