Pārlūkot izejas kodu

feat:增加支持4级筛选

ChenYL 2 gadi atpakaļ
vecāks
revīzija
8e7082bf5a
4 mainītis faili ar 718 papildinājumiem un 264 dzēšanām
  1. 2 1
      README.md
  2. 292 46
      src/DataFilter.py
  3. 315 162
      src/DataFilter.ui
  4. 109 55
      src/main.py

+ 2 - 1
README.md

@@ -5,8 +5,9 @@
 * 增加正则匹配不限制位置
 * 增加历史记录功能,能打开上一次的位置
 * 增加操作日志
-* 增加最多支持4级筛选
+* 增加显示筛选数量和结果数量
 
 开发进度
 * 2023-07-05 增加文件选择功能
 * 2023-07-06 增加正则匹配不限制位置
+* 2023-07-08 增加支持4级筛选

+ 292 - 46
src/DataFilter.py

@@ -15,54 +15,283 @@ from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
     QFont, QFontDatabase, QGradient, QIcon,
     QImage, QKeySequence, QLinearGradient, QPainter,
     QPalette, QPixmap, QRadialGradient, QTransform)
-from PySide6.QtWidgets import (QApplication, QLabel, QLineEdit, QPushButton,
-    QSizePolicy, QTextBrowser, QTextEdit, QWidget)
+from PySide6.QtWidgets import (QApplication, QHBoxLayout, QLabel, QLayout,
+    QLineEdit, QPushButton, QSizePolicy, QTextBrowser,
+    QTextEdit, QVBoxLayout, QWidget)
 
 class Ui_Form(object):
     def setupUi(self, Form):
         if not Form.objectName():
             Form.setObjectName(u"Form")
-        Form.resize(781, 524)
-        self.inputBox = QLineEdit(Form)
-        self.inputBox.setObjectName(u"inputBox")
-        self.inputBox.setGeometry(QRect(160, 110, 411, 20))
-        self.submitBtn = QPushButton(Form)
-        self.submitBtn.setObjectName(u"submitBtn")
-        self.submitBtn.setGeometry(QRect(590, 110, 75, 24))
-        self.filterCategoryBtn = QPushButton(Form)
-        self.filterCategoryBtn.setObjectName(u"filterCategoryBtn")
-        self.filterCategoryBtn.setGeometry(QRect(160, 150, 75, 24))
-        self.filterDigitBtn = QPushButton(Form)
-        self.filterDigitBtn.setObjectName(u"filterDigitBtn")
-        self.filterDigitBtn.setGeometry(QRect(250, 150, 75, 24))
-        self.filterEnglishBtn = QPushButton(Form)
-        self.filterEnglishBtn.setObjectName(u"filterEnglishBtn")
-        self.filterEnglishBtn.setGeometry(QRect(350, 150, 75, 24))
-        self.resultBox = QTextBrowser(Form)
-        self.resultBox.setObjectName(u"resultBox")
-        self.resultBox.setGeometry(QRect(460, 250, 256, 192))
-        self.originBox = QTextEdit(Form)
-        self.originBox.setObjectName(u"originBox")
-        self.originBox.setGeometry(QRect(40, 250, 151, 181))
-        self.filterCategoryBox = QTextEdit(Form)
-        self.filterCategoryBox.setObjectName(u"filterCategoryBox")
-        self.filterCategoryBox.setGeometry(QRect(230, 250, 151, 181))
-        self.label = QLabel(Form)
-        self.label.setObjectName(u"label")
-        self.label.setGeometry(QRect(50, 220, 54, 16))
+        Form.setWindowModality(Qt.NonModal)
+        Form.setEnabled(True)
+        Form.resize(1546, 514)
+        Form.setMinimumSize(QSize(800, 400))
+        self.verticalLayout_2 = QVBoxLayout(Form)
+        self.verticalLayout_2.setObjectName(u"verticalLayout_2")
+        self.horizontalLayout_2 = QHBoxLayout()
+        self.horizontalLayout_2.setObjectName(u"horizontalLayout_2")
+        self.filePathBox = QLineEdit(Form)
+        self.filePathBox.setObjectName(u"filePathBox")
+        self.filePathBox.setEnabled(False)
+
+        self.horizontalLayout_2.addWidget(self.filePathBox)
+
+        self.fileBtn = QPushButton(Form)
+        self.fileBtn.setObjectName(u"fileBtn")
+
+        self.horizontalLayout_2.addWidget(self.fileBtn)
+
+
+        self.verticalLayout_2.addLayout(self.horizontalLayout_2)
+
+        self.horizontalLayout_6 = QHBoxLayout()
+        self.horizontalLayout_6.setObjectName(u"horizontalLayout_6")
+        self.horizontalLayout_6.setSizeConstraint(QLayout.SetDefaultConstraint)
+        self.verticalLayout = QVBoxLayout()
+        self.verticalLayout.setObjectName(u"verticalLayout")
+        self.firstKeyBox = QLineEdit(Form)
+        self.firstKeyBox.setObjectName(u"firstKeyBox")
+
+        self.verticalLayout.addWidget(self.firstKeyBox)
+
+        self.horizontalLayout = QHBoxLayout()
+        self.horizontalLayout.setObjectName(u"horizontalLayout")
+        self.firstDigitBtn = QPushButton(Form)
+        self.firstDigitBtn.setObjectName(u"firstDigitBtn")
+
+        self.horizontalLayout.addWidget(self.firstDigitBtn)
+
+        self.firstCategoryBtn = QPushButton(Form)
+        self.firstCategoryBtn.setObjectName(u"firstCategoryBtn")
+
+        self.horizontalLayout.addWidget(self.firstCategoryBtn)
+
+        self.firstCharacterBtn = QPushButton(Form)
+        self.firstCharacterBtn.setObjectName(u"firstCharacterBtn")
+
+        self.horizontalLayout.addWidget(self.firstCharacterBtn)
+
+        self.firstFilterBtn = QPushButton(Form)
+        self.firstFilterBtn.setObjectName(u"firstFilterBtn")
+
+        self.horizontalLayout.addWidget(self.firstFilterBtn)
+
+
+        self.verticalLayout.addLayout(self.horizontalLayout)
+
         self.label_2 = QLabel(Form)
         self.label_2.setObjectName(u"label_2")
-        self.label_2.setGeometry(QRect(230, 220, 54, 16))
+
+        self.verticalLayout.addWidget(self.label_2)
+
+        self.firstCategoryBox = QTextEdit(Form)
+        self.firstCategoryBox.setObjectName(u"firstCategoryBox")
+        sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.firstCategoryBox.sizePolicy().hasHeightForWidth())
+        self.firstCategoryBox.setSizePolicy(sizePolicy)
+
+        self.verticalLayout.addWidget(self.firstCategoryBox)
+
         self.label_3 = QLabel(Form)
         self.label_3.setObjectName(u"label_3")
-        self.label_3.setGeometry(QRect(480, 220, 54, 16))
-        self.fileBtn = QPushButton(Form)
-        self.fileBtn.setObjectName(u"fileBtn")
-        self.fileBtn.setGeometry(QRect(590, 70, 75, 23))
-        self.filePathBox = QLineEdit(Form)
-        self.filePathBox.setObjectName(u"filePathBox")
-        self.filePathBox.setEnabled(False)
-        self.filePathBox.setGeometry(QRect(160, 70, 411, 20))
+
+        self.verticalLayout.addWidget(self.label_3)
+
+        self.firstResultBox = QTextBrowser(Form)
+        self.firstResultBox.setObjectName(u"firstResultBox")
+        sizePolicy.setHeightForWidth(self.firstResultBox.sizePolicy().hasHeightForWidth())
+        self.firstResultBox.setSizePolicy(sizePolicy)
+
+        self.verticalLayout.addWidget(self.firstResultBox)
+
+        self.verticalLayout.setStretch(3, 1)
+        self.verticalLayout.setStretch(5, 5)
+
+        self.horizontalLayout_6.addLayout(self.verticalLayout)
+
+        self.verticalLayout_4 = QVBoxLayout()
+        self.verticalLayout_4.setObjectName(u"verticalLayout_4")
+        self.secondKeyBox = QLineEdit(Form)
+        self.secondKeyBox.setObjectName(u"secondKeyBox")
+
+        self.verticalLayout_4.addWidget(self.secondKeyBox)
+
+        self.horizontalLayout_3 = QHBoxLayout()
+        self.horizontalLayout_3.setObjectName(u"horizontalLayout_3")
+        self.secondDigitBtn = QPushButton(Form)
+        self.secondDigitBtn.setObjectName(u"secondDigitBtn")
+
+        self.horizontalLayout_3.addWidget(self.secondDigitBtn)
+
+        self.secondCategoryBtn = QPushButton(Form)
+        self.secondCategoryBtn.setObjectName(u"secondCategoryBtn")
+
+        self.horizontalLayout_3.addWidget(self.secondCategoryBtn)
+
+        self.secondCharacterBtn = QPushButton(Form)
+        self.secondCharacterBtn.setObjectName(u"secondCharacterBtn")
+
+        self.horizontalLayout_3.addWidget(self.secondCharacterBtn)
+
+        self.secondFilterBtn = QPushButton(Form)
+        self.secondFilterBtn.setObjectName(u"secondFilterBtn")
+
+        self.horizontalLayout_3.addWidget(self.secondFilterBtn)
+
+
+        self.verticalLayout_4.addLayout(self.horizontalLayout_3)
+
+        self.label_4 = QLabel(Form)
+        self.label_4.setObjectName(u"label_4")
+
+        self.verticalLayout_4.addWidget(self.label_4)
+
+        self.secondCategoryBox = QTextEdit(Form)
+        self.secondCategoryBox.setObjectName(u"secondCategoryBox")
+        sizePolicy.setHeightForWidth(self.secondCategoryBox.sizePolicy().hasHeightForWidth())
+        self.secondCategoryBox.setSizePolicy(sizePolicy)
+
+        self.verticalLayout_4.addWidget(self.secondCategoryBox)
+
+        self.label_5 = QLabel(Form)
+        self.label_5.setObjectName(u"label_5")
+
+        self.verticalLayout_4.addWidget(self.label_5)
+
+        self.secondResultBox = QTextBrowser(Form)
+        self.secondResultBox.setObjectName(u"secondResultBox")
+
+        self.verticalLayout_4.addWidget(self.secondResultBox)
+
+        self.verticalLayout_4.setStretch(3, 1)
+        self.verticalLayout_4.setStretch(5, 5)
+
+        self.horizontalLayout_6.addLayout(self.verticalLayout_4)
+
+        self.verticalLayout_7 = QVBoxLayout()
+        self.verticalLayout_7.setObjectName(u"verticalLayout_7")
+        self.threeKeyBox = QLineEdit(Form)
+        self.threeKeyBox.setObjectName(u"threeKeyBox")
+
+        self.verticalLayout_7.addWidget(self.threeKeyBox)
+
+        self.horizontalLayout_4 = QHBoxLayout()
+        self.horizontalLayout_4.setObjectName(u"horizontalLayout_4")
+        self.threeDigitBtn = QPushButton(Form)
+        self.threeDigitBtn.setObjectName(u"threeDigitBtn")
+
+        self.horizontalLayout_4.addWidget(self.threeDigitBtn)
+
+        self.threeCategoryBtn = QPushButton(Form)
+        self.threeCategoryBtn.setObjectName(u"threeCategoryBtn")
+
+        self.horizontalLayout_4.addWidget(self.threeCategoryBtn)
+
+        self.threeCharacterBtn = QPushButton(Form)
+        self.threeCharacterBtn.setObjectName(u"threeCharacterBtn")
+
+        self.horizontalLayout_4.addWidget(self.threeCharacterBtn)
+
+        self.threeFilterBtn = QPushButton(Form)
+        self.threeFilterBtn.setObjectName(u"threeFilterBtn")
+
+        self.horizontalLayout_4.addWidget(self.threeFilterBtn)
+
+
+        self.verticalLayout_7.addLayout(self.horizontalLayout_4)
+
+        self.label_6 = QLabel(Form)
+        self.label_6.setObjectName(u"label_6")
+
+        self.verticalLayout_7.addWidget(self.label_6)
+
+        self.threeCategoryBox = QTextEdit(Form)
+        self.threeCategoryBox.setObjectName(u"threeCategoryBox")
+        sizePolicy.setHeightForWidth(self.threeCategoryBox.sizePolicy().hasHeightForWidth())
+        self.threeCategoryBox.setSizePolicy(sizePolicy)
+
+        self.verticalLayout_7.addWidget(self.threeCategoryBox)
+
+        self.label_7 = QLabel(Form)
+        self.label_7.setObjectName(u"label_7")
+
+        self.verticalLayout_7.addWidget(self.label_7)
+
+        self.threeResultBox = QTextBrowser(Form)
+        self.threeResultBox.setObjectName(u"threeResultBox")
+
+        self.verticalLayout_7.addWidget(self.threeResultBox)
+
+        self.verticalLayout_7.setStretch(3, 1)
+        self.verticalLayout_7.setStretch(5, 5)
+
+        self.horizontalLayout_6.addLayout(self.verticalLayout_7)
+
+        self.verticalLayout_10 = QVBoxLayout()
+        self.verticalLayout_10.setObjectName(u"verticalLayout_10")
+        self.fourKeyBox = QLineEdit(Form)
+        self.fourKeyBox.setObjectName(u"fourKeyBox")
+
+        self.verticalLayout_10.addWidget(self.fourKeyBox)
+
+        self.horizontalLayout_5 = QHBoxLayout()
+        self.horizontalLayout_5.setObjectName(u"horizontalLayout_5")
+        self.fourDigitBtn = QPushButton(Form)
+        self.fourDigitBtn.setObjectName(u"fourDigitBtn")
+
+        self.horizontalLayout_5.addWidget(self.fourDigitBtn)
+
+        self.fourCategoryBtn = QPushButton(Form)
+        self.fourCategoryBtn.setObjectName(u"fourCategoryBtn")
+
+        self.horizontalLayout_5.addWidget(self.fourCategoryBtn)
+
+        self.fourCharacterBtn = QPushButton(Form)
+        self.fourCharacterBtn.setObjectName(u"fourCharacterBtn")
+
+        self.horizontalLayout_5.addWidget(self.fourCharacterBtn)
+
+        self.fourFilterBtn = QPushButton(Form)
+        self.fourFilterBtn.setObjectName(u"fourFilterBtn")
+
+        self.horizontalLayout_5.addWidget(self.fourFilterBtn)
+
+
+        self.verticalLayout_10.addLayout(self.horizontalLayout_5)
+
+        self.label_8 = QLabel(Form)
+        self.label_8.setObjectName(u"label_8")
+
+        self.verticalLayout_10.addWidget(self.label_8)
+
+        self.fourCategoryBox = QTextEdit(Form)
+        self.fourCategoryBox.setObjectName(u"fourCategoryBox")
+        sizePolicy.setHeightForWidth(self.fourCategoryBox.sizePolicy().hasHeightForWidth())
+        self.fourCategoryBox.setSizePolicy(sizePolicy)
+
+        self.verticalLayout_10.addWidget(self.fourCategoryBox)
+
+        self.label_9 = QLabel(Form)
+        self.label_9.setObjectName(u"label_9")
+
+        self.verticalLayout_10.addWidget(self.label_9)
+
+        self.fourResultBox = QTextBrowser(Form)
+        self.fourResultBox.setObjectName(u"fourResultBox")
+
+        self.verticalLayout_10.addWidget(self.fourResultBox)
+
+        self.verticalLayout_10.setStretch(3, 1)
+        self.verticalLayout_10.setStretch(5, 5)
+
+        self.horizontalLayout_6.addLayout(self.verticalLayout_10)
+
+
+        self.verticalLayout_2.addLayout(self.horizontalLayout_6)
+
 
         self.retranslateUi(Form)
 
@@ -71,14 +300,31 @@ class Ui_Form(object):
 
     def retranslateUi(self, Form):
         Form.setWindowTitle(QCoreApplication.translate("Form", u"\u6570\u636e\u7b5b\u9009", None))
-        self.submitBtn.setText(QCoreApplication.translate("Form", u"\u63d0\u53d6", None))
-        self.filterCategoryBtn.setText(QCoreApplication.translate("Form", u"\u63d2\u5165\u7c7b\u522b", None))
-        self.filterDigitBtn.setText(QCoreApplication.translate("Form", u"\u63d2\u5165\u6570\u5b57", None))
-        self.filterEnglishBtn.setText(QCoreApplication.translate("Form", u"\u63d2\u5165\u82f1\u6587", None))
-        self.label.setText(QCoreApplication.translate("Form", u"\u539f\u59cb\u6570\u636e", None))
+        self.filePathBox.setPlaceholderText(QCoreApplication.translate("Form", u"\u8bf7\u9009\u62e9\u6587\u4ef6", None))
+        self.fileBtn.setText(QCoreApplication.translate("Form", u"\u6587\u4ef6\u9009\u62e9", None))
+        self.firstDigitBtn.setText(QCoreApplication.translate("Form", u"\u63d2\u5165\u6570\u5b57", None))
+        self.firstCategoryBtn.setText(QCoreApplication.translate("Form", u"\u63d2\u5165\u7c7b\u522b", None))
+        self.firstCharacterBtn.setText(QCoreApplication.translate("Form", u"\u63d2\u5165\u82f1\u6587", None))
+        self.firstFilterBtn.setText(QCoreApplication.translate("Form", u"\u63d0\u53d6", None))
         self.label_2.setText(QCoreApplication.translate("Form", u"\u81ea\u5b9a\u4e49\u7c7b\u522b\u8bcd", None))
         self.label_3.setText(QCoreApplication.translate("Form", u"\u63d0\u53d6\u7ed3\u679c", None))
-        self.fileBtn.setText(QCoreApplication.translate("Form", u"\u6587\u4ef6\u9009\u62e9", None))
-        self.filePathBox.setPlaceholderText(QCoreApplication.translate("Form", u"\u8bf7\u9009\u62e9\u6587\u4ef6", None))
+        self.secondDigitBtn.setText(QCoreApplication.translate("Form", u"\u63d2\u5165\u6570\u5b57", None))
+        self.secondCategoryBtn.setText(QCoreApplication.translate("Form", u"\u63d2\u5165\u7c7b\u522b", None))
+        self.secondCharacterBtn.setText(QCoreApplication.translate("Form", u"\u63d2\u5165\u82f1\u6587", None))
+        self.secondFilterBtn.setText(QCoreApplication.translate("Form", u"\u63d0\u53d6", None))
+        self.label_4.setText(QCoreApplication.translate("Form", u"\u81ea\u5b9a\u4e49\u7c7b\u522b\u8bcd", None))
+        self.label_5.setText(QCoreApplication.translate("Form", u"\u63d0\u53d6\u7ed3\u679c", None))
+        self.threeDigitBtn.setText(QCoreApplication.translate("Form", u"\u63d2\u5165\u6570\u5b57", None))
+        self.threeCategoryBtn.setText(QCoreApplication.translate("Form", u"\u63d2\u5165\u7c7b\u522b", None))
+        self.threeCharacterBtn.setText(QCoreApplication.translate("Form", u"\u63d2\u5165\u82f1\u6587", None))
+        self.threeFilterBtn.setText(QCoreApplication.translate("Form", u"\u63d0\u53d6", None))
+        self.label_6.setText(QCoreApplication.translate("Form", u"\u81ea\u5b9a\u4e49\u7c7b\u522b\u8bcd", None))
+        self.label_7.setText(QCoreApplication.translate("Form", u"\u63d0\u53d6\u7ed3\u679c", None))
+        self.fourDigitBtn.setText(QCoreApplication.translate("Form", u"\u63d2\u5165\u6570\u5b57", None))
+        self.fourCategoryBtn.setText(QCoreApplication.translate("Form", u"\u63d2\u5165\u7c7b\u522b", None))
+        self.fourCharacterBtn.setText(QCoreApplication.translate("Form", u"\u63d2\u5165\u82f1\u6587", None))
+        self.fourFilterBtn.setText(QCoreApplication.translate("Form", u"\u63d0\u53d6", None))
+        self.label_8.setText(QCoreApplication.translate("Form", u"\u81ea\u5b9a\u4e49\u7c7b\u522b\u8bcd", None))
+        self.label_9.setText(QCoreApplication.translate("Form", u"\u63d0\u53d6\u7ed3\u679c", None))
     # retranslateUi
 

+ 315 - 162
src/DataFilter.ui

@@ -2,177 +2,330 @@
 <ui version="4.0">
  <class>Form</class>
  <widget class="QWidget" name="Form">
+  <property name="windowModality">
+   <enum>Qt::NonModal</enum>
+  </property>
+  <property name="enabled">
+   <bool>true</bool>
+  </property>
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>781</width>
-    <height>524</height>
+    <width>1546</width>
+    <height>514</height>
    </rect>
   </property>
+  <property name="minimumSize">
+   <size>
+    <width>800</width>
+    <height>400</height>
+   </size>
+  </property>
   <property name="windowTitle">
    <string>数据筛选</string>
   </property>
-  <widget class="QLineEdit" name="inputBox">
-   <property name="geometry">
-    <rect>
-     <x>160</x>
-     <y>110</y>
-     <width>411</width>
-     <height>20</height>
-    </rect>
-   </property>
-  </widget>
-  <widget class="QPushButton" name="submitBtn">
-   <property name="geometry">
-    <rect>
-     <x>590</x>
-     <y>110</y>
-     <width>75</width>
-     <height>24</height>
-    </rect>
-   </property>
-   <property name="text">
-    <string>提取</string>
-   </property>
-  </widget>
-  <widget class="QPushButton" name="filterCategoryBtn">
-   <property name="geometry">
-    <rect>
-     <x>160</x>
-     <y>150</y>
-     <width>75</width>
-     <height>24</height>
-    </rect>
-   </property>
-   <property name="text">
-    <string>插入类别</string>
-   </property>
-  </widget>
-  <widget class="QPushButton" name="filterDigitBtn">
-   <property name="geometry">
-    <rect>
-     <x>250</x>
-     <y>150</y>
-     <width>75</width>
-     <height>24</height>
-    </rect>
-   </property>
-   <property name="text">
-    <string>插入数字</string>
-   </property>
-  </widget>
-  <widget class="QPushButton" name="filterEnglishBtn">
-   <property name="geometry">
-    <rect>
-     <x>350</x>
-     <y>150</y>
-     <width>75</width>
-     <height>24</height>
-    </rect>
-   </property>
-   <property name="text">
-    <string>插入英文</string>
-   </property>
-  </widget>
-  <widget class="QTextBrowser" name="resultBox">
-   <property name="geometry">
-    <rect>
-     <x>460</x>
-     <y>250</y>
-     <width>256</width>
-     <height>192</height>
-    </rect>
-   </property>
-  </widget>
-  <widget class="QTextEdit" name="originBox">
-   <property name="geometry">
-    <rect>
-     <x>40</x>
-     <y>250</y>
-     <width>151</width>
-     <height>181</height>
-    </rect>
-   </property>
-  </widget>
-  <widget class="QTextEdit" name="filterCategoryBox">
-   <property name="geometry">
-    <rect>
-     <x>230</x>
-     <y>250</y>
-     <width>151</width>
-     <height>181</height>
-    </rect>
-   </property>
-  </widget>
-  <widget class="QLabel" name="label">
-   <property name="geometry">
-    <rect>
-     <x>50</x>
-     <y>220</y>
-     <width>54</width>
-     <height>16</height>
-    </rect>
-   </property>
-   <property name="text">
-    <string>原始数据</string>
-   </property>
-  </widget>
-  <widget class="QLabel" name="label_2">
-   <property name="geometry">
-    <rect>
-     <x>230</x>
-     <y>220</y>
-     <width>54</width>
-     <height>16</height>
-    </rect>
-   </property>
-   <property name="text">
-    <string>自定义类别词</string>
-   </property>
-  </widget>
-  <widget class="QLabel" name="label_3">
-   <property name="geometry">
-    <rect>
-     <x>480</x>
-     <y>220</y>
-     <width>54</width>
-     <height>16</height>
-    </rect>
-   </property>
-   <property name="text">
-    <string>提取结果</string>
-   </property>
-  </widget>
-  <widget class="QPushButton" name="fileBtn">
-   <property name="geometry">
-    <rect>
-     <x>590</x>
-     <y>70</y>
-     <width>75</width>
-     <height>23</height>
-    </rect>
-   </property>
-   <property name="text">
-    <string>文件选择</string>
-   </property>
-  </widget>
-  <widget class="QLineEdit" name="filePathBox">
-   <property name="enabled">
-    <bool>false</bool>
-   </property>
-   <property name="geometry">
-    <rect>
-     <x>160</x>
-     <y>70</y>
-     <width>411</width>
-     <height>20</height>
-    </rect>
-   </property>
-   <property name="placeholderText">
-    <string>请选择文件</string>
-   </property>
-  </widget>
+  <layout class="QVBoxLayout" name="verticalLayout_2">
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout_2">
+     <item>
+      <widget class="QLineEdit" name="filePathBox">
+       <property name="enabled">
+        <bool>false</bool>
+       </property>
+       <property name="placeholderText">
+        <string>请选择文件</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="fileBtn">
+       <property name="text">
+        <string>文件选择</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout_6">
+     <property name="sizeConstraint">
+      <enum>QLayout::SetDefaultConstraint</enum>
+     </property>
+     <item>
+      <layout class="QVBoxLayout" name="verticalLayout" stretch="0,0,0,1,0,5">
+       <item>
+        <widget class="QLineEdit" name="firstKeyBox"/>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout">
+         <item>
+          <widget class="QPushButton" name="firstDigitBtn">
+           <property name="text">
+            <string>插入数字</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="firstCategoryBtn">
+           <property name="text">
+            <string>插入类别</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="firstCharacterBtn">
+           <property name="text">
+            <string>插入英文</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="firstFilterBtn">
+           <property name="text">
+            <string>提取</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <widget class="QLabel" name="label_2">
+         <property name="text">
+          <string>自定义类别词</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QTextEdit" name="firstCategoryBox">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QLabel" name="label_3">
+         <property name="text">
+          <string>提取结果</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QTextBrowser" name="firstResultBox">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <layout class="QVBoxLayout" name="verticalLayout_4" stretch="0,0,0,1,0,5">
+       <item>
+        <widget class="QLineEdit" name="secondKeyBox"/>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_3">
+         <item>
+          <widget class="QPushButton" name="secondDigitBtn">
+           <property name="text">
+            <string>插入数字</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="secondCategoryBtn">
+           <property name="text">
+            <string>插入类别</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="secondCharacterBtn">
+           <property name="text">
+            <string>插入英文</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="secondFilterBtn">
+           <property name="text">
+            <string>提取</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <widget class="QLabel" name="label_4">
+         <property name="text">
+          <string>自定义类别词</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QTextEdit" name="secondCategoryBox">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QLabel" name="label_5">
+         <property name="text">
+          <string>提取结果</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QTextBrowser" name="secondResultBox"/>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <layout class="QVBoxLayout" name="verticalLayout_7" stretch="0,0,0,1,0,5">
+       <item>
+        <widget class="QLineEdit" name="threeKeyBox"/>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_4">
+         <item>
+          <widget class="QPushButton" name="threeDigitBtn">
+           <property name="text">
+            <string>插入数字</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="threeCategoryBtn">
+           <property name="text">
+            <string>插入类别</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="threeCharacterBtn">
+           <property name="text">
+            <string>插入英文</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="threeFilterBtn">
+           <property name="text">
+            <string>提取</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <widget class="QLabel" name="label_6">
+         <property name="text">
+          <string>自定义类别词</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QTextEdit" name="threeCategoryBox">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QLabel" name="label_7">
+         <property name="text">
+          <string>提取结果</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QTextBrowser" name="threeResultBox"/>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <layout class="QVBoxLayout" name="verticalLayout_10" stretch="0,0,0,1,0,5">
+       <item>
+        <widget class="QLineEdit" name="fourKeyBox"/>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_5">
+         <item>
+          <widget class="QPushButton" name="fourDigitBtn">
+           <property name="text">
+            <string>插入数字</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="fourCategoryBtn">
+           <property name="text">
+            <string>插入类别</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="fourCharacterBtn">
+           <property name="text">
+            <string>插入英文</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="fourFilterBtn">
+           <property name="text">
+            <string>提取</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <widget class="QLabel" name="label_8">
+         <property name="text">
+          <string>自定义类别词</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QTextEdit" name="fourCategoryBox">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QLabel" name="label_9">
+         <property name="text">
+          <string>提取结果</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QTextBrowser" name="fourResultBox"/>
+       </item>
+      </layout>
+     </item>
+    </layout>
+   </item>
+  </layout>
  </widget>
  <resources/>
  <connections/>

+ 109 - 55
src/main.py

@@ -1,8 +1,10 @@
 # -*- coding: utf-8 -*-
 import re
 import sys
+from functools import partial
 
-from PySide6.QtWidgets import QMainWindow, QApplication, QMessageBox, QFileDialog
+from PySide6.QtWidgets import QMainWindow, QApplication, QMessageBox, QFileDialog, QWidget, QLineEdit, QPushButton, \
+  QTextEdit, QTextBrowser
 
 from src.DataFilter import Ui_Form
 
@@ -10,61 +12,129 @@ category_pattern = re.compile(r'\[类别\]')
 digit_pattern = re.compile(r'\[数字\]')
 english_pattern = re.compile(r'\[字母\]')
 
-class MyMainForm(QMainWindow, Ui_Form):
+
+class MyMainForm(QWidget, Ui_Form):
+
+  CHARACTER_FILTER_STR = "[字母]"
+  DIGIT_FILTER_STR = "[数字]"
+  CATEGORY_FILTER_STR = "[类别]"
+
   def __init__(self, parent=None):
     super(MyMainForm, self).__init__(parent)
     self.setupUi(self)
-    self.submitBtn.clicked.connect(self.submit)
-    self.filterCategoryBtn.clicked.connect(self.insertCategoryRegex)
-    self.filterDigitBtn.clicked.connect(self.insertDigitRegex)
-    self.filterEnglishBtn.clicked.connect(self.insertEnglishRegex)
+    self.bind()
+
+  def bind(self):
+    self.toolDict = {
+      self.firstDigitBtn.objectName(): self.firstKeyBox,
+      self.firstCategoryBtn.objectName(): self.firstKeyBox,
+      self.firstCharacterBtn.objectName(): self.firstKeyBox,
+      self.secondDigitBtn.objectName(): self.secondKeyBox,
+      self.secondCategoryBtn.objectName(): self.secondKeyBox,
+      self.secondCharacterBtn.objectName(): self.secondKeyBox,
+      self.threeDigitBtn.objectName(): self.threeKeyBox,
+      self.threeCategoryBtn.objectName(): self.threeKeyBox,
+      self.threeCharacterBtn.objectName(): self.threeKeyBox,
+      self.fourDigitBtn.objectName(): self.fourKeyBox,
+      self.fourCategoryBtn.objectName(): self.fourKeyBox,
+      self.fourCharacterBtn.objectName(): self.fourKeyBox
+    }
+    self.resultDict = {
+      self.firstFilterBtn.objectName(): (self.firstKeyBox, self.firstCategoryBox, self.firstResultBox, None),
+      self.secondFilterBtn.objectName(): (self.secondKeyBox, self.secondCategoryBox, self.secondResultBox, self.firstResultBox),
+      self.threeFilterBtn.objectName(): (self.threeKeyBox, self.threeCategoryBox, self.threeResultBox, self.secondResultBox),
+      self.fourFilterBtn.objectName(): (self.fourKeyBox, self.fourCategoryBox, self.fourResultBox, self.threeResultBox)
+    }
+
     self.fileBtn.clicked.connect(self.selectFile)
 
-  def submit(self):
-    inputText = self.inputBox.text()
-    if len(inputText) == 0:
-      QMessageBox.warning(self, "输入提示", "请输入待筛选关键词")
-      return
+    self.firstCategoryBtn.clicked.connect(partial(self.add_filter_str, self.firstCategoryBtn, self.CATEGORY_FILTER_STR))
+    self.firstDigitBtn.clicked.connect(partial(self.add_filter_str, self.firstDigitBtn, self.DIGIT_FILTER_STR))
+    self.firstCharacterBtn.clicked.connect(partial(self.add_filter_str, self.firstCharacterBtn, self.CHARACTER_FILTER_STR))
+    self.firstFilterBtn.clicked.connect(partial(self.submit, self.firstFilterBtn))
 
-    cnt = 0
-    if category_pattern.search(inputText) is not None:
-      cnt = cnt + 1
-    if digit_pattern.search(inputText) is not None:
-      cnt = cnt + 1
-    if english_pattern.search(inputText) is not None:
-      cnt = cnt + 1
-    if cnt > 1:
-      QMessageBox.warning(self, "提示", "一次只能使用一种正则筛选项")
-      return
+    self.secondCategoryBtn.clicked.connect(partial(self.add_filter_str, self.secondCategoryBtn, self.CATEGORY_FILTER_STR))
+    self.secondDigitBtn.clicked.connect(partial(self.add_filter_str, self.secondDigitBtn, self.DIGIT_FILTER_STR))
+    self.secondCharacterBtn.clicked.connect(partial(self.add_filter_str, self.secondCharacterBtn, self.CHARACTER_FILTER_STR))
+    self.secondFilterBtn.clicked.connect(partial(self.submit, self.secondFilterBtn))
 
-    categoryText = self.filterCategoryBox.toPlainText()
-    if category_pattern.search(inputText) is not None and len(categoryText) == 0:
-      QMessageBox.warning(self, "提示", "使用类别筛选,请输入待筛选的类别关键词")
-      return
+    self.threeCategoryBtn.clicked.connect(partial(self.add_filter_str, self.threeCategoryBtn, self.CATEGORY_FILTER_STR))
+    self.threeDigitBtn.clicked.connect(partial(self.add_filter_str, self.threeDigitBtn, self.DIGIT_FILTER_STR))
+    self.threeCharacterBtn.clicked.connect(partial(self.add_filter_str, self.threeCharacterBtn, self.CHARACTER_FILTER_STR))
+    self.threeFilterBtn.clicked.connect(partial(self.submit, self.threeFilterBtn))
+
+    self.fourCategoryBtn.clicked.connect(partial(self.add_filter_str, self.fourCategoryBtn, self.CATEGORY_FILTER_STR))
+    self.fourDigitBtn.clicked.connect(partial(self.add_filter_str, self.fourDigitBtn, self.DIGIT_FILTER_STR))
+    self.fourCharacterBtn.clicked.connect(partial(self.add_filter_str, self.fourCharacterBtn, self.CHARACTER_FILTER_STR))
+    self.fourFilterBtn.clicked.connect(partial(self.submit, self.fourFilterBtn))
+
+  def selectFile(self):
+    file_path = QFileDialog.getOpenFileName(self, "选择文件")
+    self.filePathBox.setText(file_path[0])
+
+  def add_filter_str(self, btn_widget: QPushButton, filter_text):
+    key_box = self.toolDict[btn_widget.objectName()]
+    key_box.setText(key_box.text() + filter_text)
+
+  def submit(self, filter_btn: QPushButton):
 
+    key_box, category_box, result_box, parent_result_box = self.resultDict[filter_btn.objectName()]
 
-    file_path = self.filePathBox.text()
-    if len(file_path) == 0:
-      QMessageBox.warning(self, "提示", "请选择带筛选文件")
+    if not self.check(key_box, category_box, parent_result_box):
       return
 
+    key_text = key_box.text()
+
     originKeyArray = None
-    with open(file_path, 'r', encoding='utf-8') as f:
-      originKeyArray = f.readlines()
+    if parent_result_box is None:
+      with open(self.filePathBox.text(), 'r', encoding='utf-8') as f:
+        originKeyArray = [content.replace("\n", "") for content in f.readlines()]
+    else:
+      originKeyArray = parent_result_box.toPlainText().split("\n")
 
     resultKeyArray = []
-    if category_pattern.search(inputText) is not None:
-      categoryKeyArray = categoryText.splitlines()
+    if category_pattern.search(key_text) is not None:
+      categoryKeyArray = category_box.toPlainText().splitlines()
       for categoryKey in categoryKeyArray:
-        resultKeyArray.extend(self.filter(originKeyArray, inputText, "类别", categoryKey))
-    elif digit_pattern.search(inputText) is not None:
-      resultKeyArray.extend(self.filter(originKeyArray, inputText, "数字", "0-9"))
-    elif english_pattern.search(inputText) is not None:
-      resultKeyArray.extend(self.filter(originKeyArray, inputText, "字母", "A-Za-z"))
+        resultKeyArray.extend(self.filter(originKeyArray, key_text, "类别", categoryKey))
+    elif digit_pattern.search(key_text) is not None:
+      resultKeyArray.extend(self.filter(originKeyArray, key_text, "数字", "0-9"))
+    elif english_pattern.search(key_text) is not None:
+      resultKeyArray.extend(self.filter(originKeyArray, key_text, "字母", "A-Za-z"))
     else:
-      resultKeyArray.extend(self.filter(originKeyArray, inputText))
+      resultKeyArray.extend(self.filter(originKeyArray, key_text))
+
+    result_box.setText("\n".join(resultKeyArray))
+
+  def check(self, key_box: QLineEdit, category_box: QTextEdit, parent_result_box: QTextBrowser):
+    key_text = key_box.text()
+    if len(key_text) == 0:
+      QMessageBox.warning(self, "输入提示", "请输入待筛选关键词")
+      return False
+
+    cnt = 0
+    for pattern in [category_pattern, digit_pattern, english_pattern]:
+      if pattern.search(key_text) is not None:
+        cnt = cnt + 1
+      if cnt > 1:
+        QMessageBox.warning(self, "提示", "一次只能使用一种正则筛选项")
+        return False
+
+    category_text = category_box.toPlainText()
+    if category_pattern.search(key_text) is not None and len(category_text) == 0:
+      QMessageBox.warning(self, "提示", "使用类别筛选,请输入待筛选的类别关键词")
+      return False
 
-    self.resultBox.setText("".join(resultKeyArray))
+    if parent_result_box is None:
+      file_path = self.filePathBox.text()
+      if len(file_path) == 0:
+        QMessageBox.warning(self, "提示", "请选择带筛选文件")
+        return False
+    elif len(parent_result_box.toPlainText()) == 0:
+      QMessageBox.warning(self, "提示", "上级结果中没有数据")
+      return False
+
+    return True
 
   def filter(self, originArray, inputText, oldStr=None, newStr=None):
     resultArray = []
@@ -85,22 +155,6 @@ class MyMainForm(QMainWindow, Ui_Form):
           resultArray.append(originKey)
     return resultArray
 
-  def insertCategoryRegex(self):
-    self.setLineEditText("[类别]")
-
-  def insertDigitRegex(self):
-    self.setLineEditText("[数字]")
-
-  def insertEnglishRegex(self):
-    self.setLineEditText("[字母]")
-
-  def setLineEditText(self, regexText):
-    text = self.inputBox.text()
-    self.inputBox.setText(text + regexText)
-
-  def selectFile(self):
-    file_path = QFileDialog.getOpenFileName(self, "选择文件")
-    self.filePathBox.setText(file_path[0])
 
 if __name__ == "__main__":
   app = QApplication(sys.argv)