100 lines
2.8 KiB
Python
100 lines
2.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
@Time : 2023/6/27/027 9:11
|
|
@Author : 李子
|
|
@Url : https://github.com/kslz
|
|
"""
|
|
from PySide6.QtCore import QMutex, Signal, QObject, QMutexLocker, QRunnable, QThreadPool, Qt
|
|
from PySide6.QtWidgets import QWidget, QLabel, QSpinBox, QHBoxLayout
|
|
|
|
|
|
class ProgressUpdater(QObject):
|
|
"""
|
|
进度更新器,用于接收任务完成信号并更新进度条
|
|
"""
|
|
progressUpdated = Signal(int)
|
|
|
|
def __init__(self, progress_bar):
|
|
super().__init__()
|
|
self.progress_bar = progress_bar
|
|
self.mutex = QMutex()
|
|
|
|
def updateProgress(self):
|
|
with QMutexLocker(self.mutex):
|
|
# 更新进度条
|
|
self.progress_bar.setValue(self.progress_bar.value() + 1)
|
|
|
|
|
|
class SignalTool(QObject):
|
|
"""
|
|
这个类唯一的作用是用来帮发不出信号的物件发出信号
|
|
"""
|
|
started = Signal()
|
|
finished = Signal()
|
|
change_count = Signal(int)
|
|
|
|
|
|
class CustomThreadPool(QThreadPool):
|
|
noTasksRunning = Signal()
|
|
|
|
def __init__(self, parent=None):
|
|
super().__init__(parent)
|
|
self.activeTasks = 0
|
|
self.mutex = QMutex()
|
|
|
|
def start(self, arg__1, priority=0):
|
|
self.changeActiveTasks(1)
|
|
super().start(arg__1, priority)
|
|
self.changeActiveTasks(-1)
|
|
self.taskFinished()
|
|
|
|
def changeActiveTasks(self, change):
|
|
with QMutexLocker(self.mutex):
|
|
self.activeTasks += change
|
|
|
|
def taskFinished(self):
|
|
with QMutexLocker(self.mutex):
|
|
if self.activeTasks == 0:
|
|
self.noTasksRunning.emit()
|
|
|
|
|
|
class ScoreWdiget(QWidget):
|
|
def __init__(self, name, k, v, parent):
|
|
super().__init__(parent)
|
|
|
|
self.k = k
|
|
|
|
# 创建标签和旋钮框
|
|
self.label = QLabel(name)
|
|
self.spinbox = QSpinBox()
|
|
|
|
font = self.label.font()
|
|
font.setPointSize(12)
|
|
self.label.setFont(font)
|
|
self.spinbox.setFont(font)
|
|
|
|
# 设置旋钮框的范围和初始值
|
|
self.spinbox.setMinimum(0)
|
|
self.spinbox.setMaximum(100)
|
|
self.spinbox.setValue(v)
|
|
|
|
# 创建水平布局
|
|
self.layout = QHBoxLayout(self)
|
|
self.layout.setContentsMargins(0, 0, 0, 0) # 这个布局的边框我找了2个小时才找出来,警钟长鸣
|
|
|
|
# 将标签和旋钮框添加到布局中
|
|
self.layout.addWidget(self.label)
|
|
self.layout.addWidget(self.spinbox)
|
|
|
|
# 设置标签靠左,旋钮框靠右
|
|
self.layout.setAlignment(self.label, Qt.AlignLeft)
|
|
self.layout.setAlignment(self.spinbox, Qt.AlignRight)
|
|
|
|
def change_text(self, name, k, v):
|
|
self.label.setText(name)
|
|
self.k = k
|
|
self.spinbox.setValue(v)
|
|
|
|
def get_score(self, score_dict: dict):
|
|
score_dict[self.k] = self.spinbox.value()
|