From f7e1ba6d4ee118ed2137a7f0f92870014631bc81 Mon Sep 17 00:00:00 2001 From: andrew Date: Thu, 21 Sep 2023 23:41:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E8=AE=A1=E7=AE=97=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE=E5=8A=9F=E8=83=BD=EF=BC=8C=E9=80=89=E6=8B=A9=E5=AF=B9?= =?UTF-8?q?=E9=BD=90=E4=BD=8D=E7=BD=AE=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- RespCoarseAlign.py | 228 +++++++++++++++++++++++++++++++++++++++++---- ui/Mian.py | 53 +++-------- ui/Mian.ui | 74 ++------------- 3 files changed, 231 insertions(+), 124 deletions(-) diff --git a/RespCoarseAlign.py b/RespCoarseAlign.py index 7bbcb0e..050bd7b 100644 --- a/RespCoarseAlign.py +++ b/RespCoarseAlign.py @@ -18,6 +18,7 @@ from PySide6.QtGui import QPixmap, QImage from PySide6.QtWidgets import QApplication, QMainWindow, QFileDialog, QMessageBox, QWidget, QPushButton from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas from matplotlib.figure import Figure +from numba import njit from scipy import signal from ui.Mian import Ui_mainWindow as Ui_respCoarseAlign @@ -56,7 +57,6 @@ ButtonState = { "pushButton_Standardize": False, "pushButton_CutOff": False, "pushButton_GetPos": False, - "pushButton_Align": False, "pushButton_JUMP": False, "pushButton_EM1": False, "pushButton_EM10": False, @@ -72,7 +72,6 @@ ButtonState = { "pushButton_Standardize": False, "pushButton_CutOff": False, "pushButton_GetPos": False, - "pushButton_Align": False, "pushButton_JUMP": False, "pushButton_EM1": False, "pushButton_EM10": False, @@ -303,16 +302,46 @@ class Data: return True, "标准化完成" def Standardize_5(self): - # 重采样 - self.processed_THO = signal.resample(self.processed_THO, - int(self.PSG_minutes * 60 * self.Config["ApplyFrequency"])) - self.processed_ABD = signal.resample(self.processed_ABD, - int(self.PSG_minutes * 60 * self.Config["ApplyFrequency"])) - self.processed_XX = signal.resample(self.processed_XX, - int(self.XX_minutes * 60 * self.Config["ApplyFrequency"])) + # 重采样 用[::]完成 + temp_frequency = self.Config["temp_frequency"] + self.processed_THO = self.processed_THO[::int(temp_frequency / self.Config["ApplyFrequency"])] + self.processed_ABD = self.processed_ABD[::int(temp_frequency / self.Config["ApplyFrequency"])] + self.processed_XX = self.processed_XX[::int(temp_frequency / self.Config["ApplyFrequency"])] + + # self.processed_THO = signal.resample(self.processed_THO, + # int(self.PSG_minutes * 60 * self.Config["ApplyFrequency"])) + # self.processed_ABD = signal.resample(self.processed_ABD, + # int(self.PSG_minutes * 60 * self.Config["ApplyFrequency"])) + # self.processed_XX = signal.resample(self.processed_XX, + # int(self.XX_minutes * 60 * self.Config["ApplyFrequency"])) return True, "最终重采样完成" + @staticmethod + def DrawPicCorrelate(tho_pxx, tho_nxx, abd_pxx, abd_nxx): + fig = Figure(figsize=(8, 7), dpi=100) + canvas = FigureCanvas(fig) + ax1 = fig.add_subplot(221) + ax1.plot(tho_pxx, color='blue') + ax1.set_title("The Correlation of THO and XinXiao") + + ax2 = fig.add_subplot(222) + ax2.plot(tho_nxx, color='blue') + ax2.set_title("The Correlation of THO and Reverse XinXiao") + + ax3 = fig.add_subplot(223) + ax3.plot(abd_pxx, color='blue') + ax3.set_title("The Correlation of ABD and XinXiao") + + ax4 = fig.add_subplot(224) + ax4.plot(abd_nxx, color='blue') + ax4.set_title("The Correlation of ABD and Reverse XinXiao") + + width, height = fig.figbbox.width, fig.figbbox.height + fig.canvas.draw() + # 返回图片以便存到QPixImage + return canvas.buffer_rgba(), width, height + def DrawPicRawOverview(self): fig = Figure(figsize=(8, 7), dpi=100) canvas = FigureCanvas(fig) @@ -334,7 +363,7 @@ class Data: width, height = fig.figbbox.width, fig.figbbox.height fig.canvas.draw() - # 返回图片以便存到QPixIamge + # 返回图片以便存到QPixImage return canvas.buffer_rgba(), width, height def DrawPicOverviewWithCutOff(self): @@ -378,9 +407,55 @@ class Data: width, height = fig.figbbox.width, fig.figbbox.height fig.canvas.draw() - # 返回图片以便存到QPixIamge + # 返回图片以便存到QPixImage return canvas.buffer_rgba(), width, height + def DrawPicOTryAlign(self): + fig = Figure(figsize=(8, 7), dpi=100) + canvas = FigureCanvas(fig) + max_x = max(self.processed_THO.shape[0] + self.Config["PSGConfig"]["PreA"], + self.processed_XX.shape[0] + self.Config["XXConfig"]["PreA"] + self.Config["pos"]) + min_x = min(self.Config["PSGConfig"]["PreA"], self.Config["XXConfig"]["PreA"] + self.Config["pos"], 0) + + ax1 = fig.add_subplot(311) + ax1.plot( + np.linspace(self.Config["PSGConfig"]["PreA"], len(self.processed_THO) + self.Config["PSGConfig"]["PreA"], + len(self.processed_THO)), self.processed_THO, color='blue') + # 绘制x = PreCut的线 和 x = PostCut的虚线 + ax1.set_xlim(min_x, max_x) + ax1.set_title("THO") + + ax2 = fig.add_subplot(312) + ax2.plot(np.linspace(self.Config["XXConfig"]["PreA"] + self.Config["pos"], + len(self.processed_XX) + self.Config["XXConfig"]["PreA"] + self.Config["pos"], + len(self.processed_XX)), self.processed_XX, color='blue') + ax2.set_xlim(min_x, max_x) + ax2.set_title("xinxiao") + + ax3 = fig.add_subplot(313) + ax3.plot( + np.linspace(self.Config["PSGConfig"]["PreA"], len(self.processed_ABD) + self.Config["PSGConfig"]["PreA"], + len(self.processed_ABD)), self.processed_ABD, color='blue') + ax3.set_xlim(min_x, max_x) + ax3.set_title("ABD") + + width, height = fig.figbbox.width, fig.figbbox.height + fig.canvas.draw() + # 返回图片以便存到QPixImage + return canvas.buffer_rgba(), width, height + + +@njit("int64[:](int64[:],int64[:])", nogil=True, parallel=True) +def get_Correlate(a, v): + result = np.empty(len(a) - len(v) * 1 - 1, dtype=np.int64) + for i in range(len(a) - len(v) - 1): + result[i] = np.sum(a[i:i + len(v)] * v) + return result + + +get_Correlate(np.array([0, 0, 0, 0, 1, 2, 3, 4, 5, 0, 0, 0, 0], dtype=np.int64), + np.array([1, 2, 3, 4, 5], dtype=np.int64)) + class MainWindow(QMainWindow): def __init__(self): @@ -395,6 +470,9 @@ class MainWindow(QMainWindow): self.ui.checkBox_custom.stateChanged.connect(self.__customChannel__) self.__disableAllButton__() + self.ui.pushButton_Refresh.setEnabled(True) + self.ui.pushButton_OpenFile.setEnabled(True) + # 绑定事件 # 刷新键分别获取PSG和XX文件夹里面的数据,获取所有编号显示在下拉框,比对编号同时存在的可选,仅存在一个文件夹的编号不可选 self.ui.pushButton_Refresh.clicked.connect(self.__refresh__) @@ -413,7 +491,100 @@ class MainWindow(QMainWindow): # self.ui.pushButton_SaveInfo.clicked.connect(self.__saveInfo__) self.ui.pushButton_Exit.clicked.connect(self.__exit__) - def __resset__(self): + # 按下checkbox_NTHO、PTHO、 PABD、NABD后启用pushbutton_Align + self.ui.checkBox_NTHO.stateChanged.connect(self.__enableAlign__) + self.ui.checkBox_PTHO.stateChanged.connect(self.__enableAlign__) + self.ui.checkBox_PABD.stateChanged.connect(self.__enableAlign__) + self.ui.checkBox_NABD.stateChanged.connect(self.__enableAlign__) + self.ui.spinBox_custom.valueChanged.connect(self.__enableAlign__) + + def __enableAlign__(self): + self.__disableAllButton__() + self.ui.label_Info.setText("绘制对齐图像···") + self.ui.progressBar.setValue(0) + QApplication.processEvents() + if self.ui.checkBox_NTHO.isChecked(): + relate = int(self.ui.checkBox_NTHO.text()) + elif self.ui.checkBox_PTHO.isChecked(): + relate = int(self.ui.checkBox_PTHO.text()) + elif self.ui.checkBox_PABD.isChecked(): + relate = int(self.ui.checkBox_PABD.text()) + elif self.ui.checkBox_NABD.isChecked(): + relate = int(self.ui.checkBox_NABD.text()) + elif self.ui.checkBox_custom.isChecked(): + relate = self.ui.spinBox_custom.value() + else: + return + + # 最大相关系数值相对于PSG的位置 + self.data.Config["pos"] = relate + self.__plot__() + self.ui.label_Info.setText("相对位置:{}".format(relate)) + self.__enableAllButton__() + self.ui.pushButton_JUMP.setEnabled(True) + + def __getPosition__(self): + # 根据截断选择,对信号进行互相关操作,得到最大值的位置 + # 计算互相关 + self.ui.progressBar.setValue(0) + self.ui.label_Info.setText("计算互相关1/2...") + self.__disableAllButton__() + QApplication.processEvents() + a = self.data.processed_THO[ + self.data.Config["PSGConfig"]["PreCut"]:len(self.data.processed_THO) - self.data.Config["PSGConfig"][ + "PostCut"]].copy() + v = self.data.processed_XX[ + self.data.Config["XXConfig"]["PreCut"]:len(self.data.processed_XX) - self.data.Config["XXConfig"][ + "PostCut"]].copy() + a *= 100 + v *= 100 + a = a.astype(np.int64) + v = v.astype(np.int64) + a = np.pad(a, (len(v) - 1, len(v) - 1), mode='constant') + tho_relate = get_Correlate(a, v) / 10000 + tho_relate2 = - tho_relate + + self.ui.progressBar.setValue(40) + self.ui.label_Info.setText("计算互相关2/2...") + QApplication.processEvents() + a = self.data.processed_ABD[ + self.data.Config["PSGConfig"]["PreCut"]:len(self.data.processed_ABD) - self.data.Config["PSGConfig"][ + "PostCut"]].copy() + v = self.data.processed_XX[ + self.data.Config["XXConfig"]["PreCut"]:len(self.data.processed_XX) - self.data.Config["XXConfig"][ + "PostCut"]].copy() + a *= 100 + v *= 100 + a = a.astype(np.int64) + v = v.astype(np.int64) + a = np.pad(a, (len(v) - 1, len(v) - 1), mode='constant') + abd_relate = get_Correlate(a, v) / 10000 + abd_relate2 = - abd_relate + + self.ui.progressBar.setValue(80) + self.ui.label_Info.setText("绘制相关系数曲线...") + QApplication.processEvents() + self.__plot__(tho_relate, tho_relate2, abd_relate, abd_relate2) + + self.ui.progressBar.setValue(90) + self.ui.label_Info.setText("计算最大值位置...") + QApplication.processEvents() + # 计算最大值位置 + tho_max = np.argmax(tho_relate) + tho_max2 = np.argmax(tho_relate2) + abd_max = np.argmax(abd_relate) + abd_max2 = np.argmax(abd_relate2) + pre = self.data.Config["PSGConfig"]["PreCut"] + self.data.Config["PSGConfig"]["PreA"] + bias = pre - len(self.data.processed_XX) + 1 + self.ui.checkBox_PABD.setText(str(abd_max + bias)) + self.ui.checkBox_PTHO.setText(str(tho_max + bias)) + self.ui.checkBox_NABD.setText(str(abd_max2 + bias)) + self.ui.checkBox_NTHO.setText(str(tho_max2 + bias)) + self.ui.progressBar.setValue(100) + self.ui.label_Info.setText("计算完成") + self.__enableAllButton__() + + def __reset__(self): ButtonState["Current"].update(ButtonState["Default"].copy()) ButtonState["Current"]["pushButton_Standardize"] = True self.ui.spinBox_PSGPreA.setValue(0) @@ -429,9 +600,17 @@ class MainWindow(QMainWindow): self.ui.checkBox_custom.setChecked(False) self.ui.spinBox_SelectEpoch.setValue(0) self.ui.spinBox_custom.setValue(0) + self.ui.checkBox_PABD.setText("备选1") + self.ui.checkBox_PTHO.setText("备选2") + self.ui.checkBox_NABD.setText("备选3") + self.ui.checkBox_NTHO.setText("备选4") def __cutOff__(self): + self.ui.label_Info.setText("开始绘制···") + self.__disableAllButton__() Conf2 = self.data.Config.copy() + self.ui.progressBar.setValue(20) + QApplication.processEvents() Conf2["PSGConfig"].update({"PreA": self.ui.spinBox_PSGPreA.value(), "PreCut": self.ui.spinBox_PSGPreCut.value(), "PostCut": self.ui.spinBox_PSGPostCut.value()}) @@ -441,14 +620,30 @@ class MainWindow(QMainWindow): self.data.Config = Conf2 self.__plot__() + self.ui.progressBar.setValue(100) + self.ui.label_Info.setText("绘制完成") + ButtonState["Current"]["pushButton_GetPos"] = True + self.__enableAllButton__() # matplotlib 绘制图像 - def __plot__(self): + def __plot__(self, *args, **kwargs): # 判读是哪个按钮点击调用的本程序 if self.sender() == self.ui.pushButton_Standardize: buffer, width, height = self.data.DrawPicRawOverview() elif self.sender() == self.ui.pushButton_CutOff: buffer, width, height = self.data.DrawPicOverviewWithCutOff() + elif self.sender() == self.ui.pushButton_GetPos: + buffer, width, height = self.data.DrawPicCorrelate(*args, **kwargs) + elif self.sender() == self.ui.checkBox_NTHO: + buffer, width, height = self.data.DrawPicOTryAlign() + elif self.sender() == self.ui.checkBox_NABD: + buffer, width, height = self.data.DrawPicOTryAlign() + elif self.sender() == self.ui.checkBox_PTHO: + buffer, width, height = self.data.DrawPicOTryAlign() + elif self.sender() == self.ui.checkBox_PABD: + buffer, width, height = self.data.DrawPicOTryAlign() + elif self.sender() == self.ui.spinBox_custom: + buffer, width, height = self.data.DrawPicOTryAlign() else: return # 显示到labelPic上 @@ -514,7 +709,7 @@ class MainWindow(QMainWindow): for widget in all_widgets: if isinstance(widget, QPushButton): if widget.objectName() in ButtonState["Current"].keys(): - widget.setEnabled(ButtonState["Current"][widget.objectName()]) + widget.setEnabled(False) def __enableAllButton__(self): # 启用按钮 @@ -545,8 +740,8 @@ class MainWindow(QMainWindow): self.ui.label_XXmins.setText(str(self.data.XX_minutes)) self.ui.progressBar.setValue(100) self.ui.label_Info.setText(info) - self.__resset__() - + self.ui.label_Pic.setText("读取成功") + self.__reset__() self.__enableAllButton__() @@ -608,7 +803,6 @@ class MainWindow(QMainWindow): self.__plot__() self.ui.progressBar.setValue(100) ButtonState["Current"]["pushButton_CutOff"] = True - ButtonState["Current"]["pushButton_GetPos"] = True self.__enableAllButton__() diff --git a/ui/Mian.py b/ui/Mian.py index dc72806..5648eba 100644 --- a/ui/Mian.py +++ b/ui/Mian.py @@ -51,7 +51,7 @@ class Ui_mainWindow(object): self.groupBox.setObjectName(u"groupBox") self.verticalLayoutWidget_7 = QWidget(self.groupBox) self.verticalLayoutWidget_7.setObjectName(u"verticalLayoutWidget_7") - self.verticalLayoutWidget_7.setGeometry(QRect(10, 20, 281, 51)) + self.verticalLayoutWidget_7.setGeometry(QRect(10, 20, 281, 61)) self.verticalLayout_8 = QVBoxLayout(self.verticalLayoutWidget_7) self.verticalLayout_8.setObjectName(u"verticalLayout_8") self.verticalLayout_8.setContentsMargins(0, 0, 0, 0) @@ -277,7 +277,7 @@ class Ui_mainWindow(object): self.groupBox_5.setObjectName(u"groupBox_5") self.verticalLayoutWidget_3 = QWidget(self.groupBox_5) self.verticalLayoutWidget_3.setObjectName(u"verticalLayoutWidget_3") - self.verticalLayoutWidget_3.setGeometry(QRect(10, 20, 281, 112)) + self.verticalLayoutWidget_3.setGeometry(QRect(10, 20, 281, 121)) self.verticalLayout_3 = QVBoxLayout(self.verticalLayoutWidget_3) self.verticalLayout_3.setObjectName(u"verticalLayout_3") self.verticalLayout_3.setContentsMargins(0, 0, 0, 0) @@ -452,8 +452,8 @@ class Ui_mainWindow(object): self.pushButton_CutOff = QPushButton(self.verticalLayoutWidget_3) self.pushButton_CutOff.setObjectName(u"pushButton_CutOff") - sizePolicy1.setHeightForWidth(self.pushButton_CutOff.sizePolicy().hasHeightForWidth()) - self.pushButton_CutOff.setSizePolicy(sizePolicy1) + sizePolicy.setHeightForWidth(self.pushButton_CutOff.sizePolicy().hasHeightForWidth()) + self.pushButton_CutOff.setSizePolicy(sizePolicy) self.pushButton_CutOff.setMinimumSize(QSize(85, 0)) self.pushButton_CutOff.setMaximumSize(QSize(85, 16777215)) @@ -484,7 +484,7 @@ class Ui_mainWindow(object): self.groupBox_4.setObjectName(u"groupBox_4") self.verticalLayoutWidget_4 = QWidget(self.groupBox_4) self.verticalLayoutWidget_4.setObjectName(u"verticalLayoutWidget_4") - self.verticalLayoutWidget_4.setGeometry(QRect(10, 20, 281, 91)) + self.verticalLayoutWidget_4.setGeometry(QRect(10, 20, 281, 61)) self.verticalLayout_4 = QVBoxLayout(self.verticalLayoutWidget_4) self.verticalLayout_4.setObjectName(u"verticalLayout_4") self.verticalLayout_4.setContentsMargins(0, 0, 0, 0) @@ -536,38 +536,6 @@ class Ui_mainWindow(object): self.verticalLayout_4.addLayout(self.horizontalLayout_11) - self.horizontalLayout_10 = QHBoxLayout() - self.horizontalLayout_10.setObjectName(u"horizontalLayout_10") - self.label_2 = QLabel(self.verticalLayoutWidget_4) - self.label_2.setObjectName(u"label_2") - sizePolicy5 = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Preferred) - sizePolicy5.setHorizontalStretch(0) - sizePolicy5.setVerticalStretch(0) - sizePolicy5.setHeightForWidth(self.label_2.sizePolicy().hasHeightForWidth()) - self.label_2.setSizePolicy(sizePolicy5) - - self.horizontalLayout_10.addWidget(self.label_2) - - self.label_3 = QLabel(self.verticalLayoutWidget_4) - self.label_3.setObjectName(u"label_3") - self.label_3.setMinimumSize(QSize(40, 0)) - self.label_3.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter) - - self.horizontalLayout_10.addWidget(self.label_3) - - self.horizontalSpacer_7 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) - - self.horizontalLayout_10.addItem(self.horizontalSpacer_7) - - self.pushButton_Align = QPushButton(self.verticalLayoutWidget_4) - self.pushButton_Align.setObjectName(u"pushButton_Align") - self.pushButton_Align.setMinimumSize(QSize(85, 0)) - - self.horizontalLayout_10.addWidget(self.pushButton_Align) - - - self.verticalLayout_4.addLayout(self.horizontalLayout_10) - self.verticalLayout.addWidget(self.groupBox_4) @@ -583,6 +551,9 @@ class Ui_mainWindow(object): self.horizontalLayout_13.setObjectName(u"horizontalLayout_13") self.label_4 = QLabel(self.verticalLayoutWidget_5) self.label_4.setObjectName(u"label_4") + sizePolicy5 = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Preferred) + sizePolicy5.setHorizontalStretch(0) + sizePolicy5.setVerticalStretch(0) sizePolicy5.setHeightForWidth(self.label_4.sizePolicy().hasHeightForWidth()) self.label_4.setSizePolicy(sizePolicy5) @@ -595,6 +566,7 @@ class Ui_mainWindow(object): self.spinBox_SelectEpoch.setMinimumSize(QSize(60, 0)) self.spinBox_SelectEpoch.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter) self.spinBox_SelectEpoch.setButtonSymbols(QAbstractSpinBox.NoButtons) + self.spinBox_SelectEpoch.setMaximum(2000) self.horizontalLayout_13.addWidget(self.spinBox_SelectEpoch) @@ -606,7 +578,7 @@ class Ui_mainWindow(object): self.pushButton_JUMP.setObjectName(u"pushButton_JUMP") sizePolicy.setHeightForWidth(self.pushButton_JUMP.sizePolicy().hasHeightForWidth()) self.pushButton_JUMP.setSizePolicy(sizePolicy) - self.pushButton_JUMP.setMaximumSize(QSize(85, 16777215)) + self.pushButton_JUMP.setMaximumSize(QSize(88, 16777215)) self.horizontalLayout_13.addWidget(self.pushButton_JUMP) @@ -687,7 +659,7 @@ class Ui_mainWindow(object): self.verticalLayout.setStretch(0, 3) self.verticalLayout.setStretch(1, 4) self.verticalLayout.setStretch(2, 5) - self.verticalLayout.setStretch(3, 4) + self.verticalLayout.setStretch(3, 3) self.verticalLayout.setStretch(4, 4) self.verticalLayout.setStretch(5, 2) self.verticalLayout.setStretch(6, 2) @@ -801,9 +773,6 @@ class Ui_mainWindow(object): self.checkBox_PABD.setText(QCoreApplication.translate("mainWindow", u"\u5907\u90093", None)) self.checkBox_NABD.setText(QCoreApplication.translate("mainWindow", u"\u5907\u90094", None)) self.checkBox_custom.setText(QCoreApplication.translate("mainWindow", u"\u81ea\u5b9a\u4e49", None)) - self.label_2.setText(QCoreApplication.translate("mainWindow", u"\u63a8\u8350\u67e5\u770bEpoch:", None)) - self.label_3.setText(QCoreApplication.translate("mainWindow", u"0", None)) - self.pushButton_Align.setText(QCoreApplication.translate("mainWindow", u"\u786e\u5b9a", None)) self.groupBox_6.setTitle(QCoreApplication.translate("mainWindow", u"\u5c40\u90e8\u89c2\u6d4b", None)) self.label_4.setText(QCoreApplication.translate("mainWindow", u"Epoch:", None)) self.pushButton_JUMP.setText(QCoreApplication.translate("mainWindow", u"\u8df3\u8f6c", None)) diff --git a/ui/Mian.ui b/ui/Mian.ui index d192b4b..a6c4af4 100644 --- a/ui/Mian.ui +++ b/ui/Mian.ui @@ -49,7 +49,7 @@ - + @@ -61,7 +61,7 @@ 10 20 281 - 51 + 61 @@ -493,7 +493,7 @@ 10 20 281 - 112 + 121 @@ -950,7 +950,7 @@ - + 0 0 @@ -1028,7 +1028,7 @@ 10 20 281 - 91 + 61 @@ -1103,65 +1103,6 @@ - - - - - - - 0 - 0 - - - - 推荐查看Epoch: - - - - - - - - 40 - 0 - - - - 0 - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 85 - 0 - - - - 确定 - - - - - @@ -1216,6 +1157,9 @@ QAbstractSpinBox::NoButtons + + 2000 + @@ -1244,7 +1188,7 @@ - 85 + 88 16777215