FileSettingPage.py 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. from PyQt5.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QTableWidget, QTableWidgetItem, \
  2. QHeaderView, QDialog, QLabel, QLineEdit, QCheckBox, QComboBox, QSizePolicy, QDialogButtonBox, QButtonGroup
  3. from DatabaseManager import DatabaseManager
  4. import config
  5. class AddInstructionDialog(QDialog):
  6. def __init__(self, instruction_data=None):
  7. super().__init__()
  8. self.setWindowTitle("指令")
  9. self.setFixedSize(400, 300)
  10. layout = QVBoxLayout()
  11. # 指令名称行
  12. self.name_layout = QHBoxLayout()
  13. self.name_label = QLabel("指令名称:")
  14. self.name_edit = QLineEdit()
  15. self.name_layout.addWidget(self.name_label)
  16. self.name_layout.addWidget(self.name_edit)
  17. layout.addLayout(self.name_layout)
  18. # 指令类型行
  19. self.type_layout = QHBoxLayout()
  20. self.type_label = QLabel("指令类型:")
  21. self.type_combobox = QComboBox()
  22. self.type_combobox.addItems(["打开文件", "打开网址", "翻页控制", "窗口切换"])
  23. # 设置下拉框的大小策略,使其水平方向和文本输入框一样长
  24. self.type_combobox.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
  25. self.type_layout.addWidget(self.type_label)
  26. self.type_layout.addWidget(self.type_combobox)
  27. layout.addLayout(self.type_layout)
  28. # 关键字行
  29. self.keyword_layout = QHBoxLayout()
  30. self.keyword_label = QLabel(" 关键字:")
  31. self.keyword_edit = QLineEdit()
  32. self.keyword_layout.addWidget(self.keyword_label)
  33. self.keyword_layout.addWidget(self.keyword_edit)
  34. layout.addLayout(self.keyword_layout)
  35. # 执行动作行
  36. self.action_layout = QHBoxLayout()
  37. self.action_label = QLabel("执行动作:")
  38. self.action_edit = QLineEdit()
  39. self.action_layout.addWidget(self.action_label)
  40. self.action_layout.addWidget(self.action_edit)
  41. layout.addLayout(self.action_layout)
  42. # 确定和取消按钮
  43. self.button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
  44. self.button_box.accepted.connect(self.accept)
  45. self.button_box.rejected.connect(self.reject)
  46. self.button_box.button(QDialogButtonBox.Ok).setText("确定")
  47. self.button_box.button(QDialogButtonBox.Cancel).setText("取消")
  48. layout.addWidget(self.button_box)
  49. self.setLayout(layout)
  50. # 如果有指令数据,则填充到输入框中
  51. if instruction_data:
  52. self.name_edit.setText(instruction_data["name"])
  53. self.keyword_edit.setText(instruction_data["keyword"])
  54. self.action_edit.setText(instruction_data["action"])
  55. # 选中对应的指令类型
  56. index = self.type_combobox.findText(instruction_data["type"])
  57. if index != -1:
  58. self.type_combobox.setCurrentIndex(index)
  59. def get_instruction_data(self):
  60. return {
  61. "name": self.name_edit.text(),
  62. "type": self.type_combobox.currentIndex(),
  63. "keyword": self.keyword_edit.text(),
  64. "action": self.action_edit.text()
  65. }
  66. class FileSettingPage(QWidget):
  67. def __init__(self, c_datas):
  68. super().__init__()
  69. # 总布局
  70. self.layout = QVBoxLayout()
  71. # 顶部按钮布局
  72. self.top_layout = QHBoxLayout()
  73. self.btnAdd = QPushButton("添加")
  74. self.btnModify = QPushButton("修改")
  75. self.btnDelete = QPushButton("删除")
  76. self.top_layout.addWidget(self.btnAdd)
  77. self.top_layout.addWidget(self.btnModify)
  78. self.top_layout.addWidget(self.btnDelete)
  79. self.top_layout.addStretch() # 使按钮靠左排列
  80. # 设置表格
  81. self.tableWidget = QTableWidget()
  82. self.tableWidget.setColumnCount(6) # 设置列数,多加一列放置选择框和ID
  83. self.tableWidget.setHorizontalHeaderLabels(["", "ID", "指令名称", "指令类型", "关键字", "执行动作"])
  84. # self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) # 列宽度平均分配
  85. self.tableWidget.verticalHeader().setVisible(False) # 隐藏垂直表头
  86. # 获取表格总宽度
  87. total_width = self.tableWidget.width()
  88. self.tableWidget.setColumnWidth(0, int(total_width * 0.05))
  89. self.tableWidget.setColumnWidth(1, int(total_width * 0.08))
  90. self.tableWidget.setColumnWidth(2, int(total_width * 0.15))
  91. self.tableWidget.setColumnWidth(3, int(total_width * 0.15))
  92. self.tableWidget.setColumnWidth(4, int(total_width * 0.27))
  93. self.tableWidget.setColumnWidth(5, int(total_width * 0.30))
  94. # 添加按钮点击事件
  95. self.btnAdd.clicked.connect(self.add_instruction)
  96. self.btnModify.clicked.connect(self.modify_instruction)
  97. self.btnDelete.clicked.connect(self.delete_instruction)
  98. # 创建单选按钮组
  99. self.checkbox_group = QButtonGroup()
  100. self.show_table(c_datas)
  101. # 将布局添加到主布局
  102. self.layout.addLayout(self.top_layout)
  103. self.layout.addWidget(self.tableWidget)
  104. self.setLayout(self.layout)
  105. def show_table(self, c_datas):
  106. # 将数据显示到表格中
  107. for row_index, row_data in enumerate(c_datas):
  108. self.tableWidget.insertRow(row_index)
  109. checkbox = QCheckBox()
  110. self.checkbox_group.addButton(checkbox) # 将复选框添加到单选按钮组
  111. self.tableWidget.setCellWidget(row_index, 0, checkbox)
  112. self.tableWidget.setItem(row_index, 1, QTableWidgetItem(str(row_data[0])))
  113. self.tableWidget.setItem(row_index, 2, QTableWidgetItem(row_data[1]))
  114. if row_data[2] == 0:
  115. action_type = "打开文件"
  116. elif row_data[2] == 1:
  117. action_type = "打开网址"
  118. elif row_data[2] == 2:
  119. action_type = "翻页控制"
  120. else:
  121. action_type = "窗口切换"
  122. self.tableWidget.setItem(row_index, 3, QTableWidgetItem(action_type))
  123. self.tableWidget.setItem(row_index, 4, QTableWidgetItem(row_data[3]))
  124. self.tableWidget.setItem(row_index, 5, QTableWidgetItem(row_data[4]))
  125. def add_instruction(self):
  126. dialog = AddInstructionDialog(None)
  127. if dialog.exec_() == QDialog.Accepted:
  128. instruction_data = dialog.get_instruction_data()
  129. # 在这里你应该将instruction_data修改到数据库并刷新表格
  130. db = DatabaseManager()
  131. db.insert_command(instruction_data["name"], instruction_data["type"], instruction_data["keyword"],
  132. instruction_data["action"])
  133. c_datas = db.fetch_all_commands()
  134. db.__del__()
  135. # 先清空数据,再显示新数据
  136. self.tableWidget.setRowCount(0)
  137. self.show_table(c_datas)
  138. config.local_commands = c_datas
  139. def modify_instruction(self):
  140. """获取选中的行索引"""
  141. row_index = self.tableWidget.currentRow()
  142. if row_index == -1: # 没有选中任何复选框
  143. return None
  144. # 获取选中行的数据
  145. data = {
  146. "name": self.tableWidget.item(row_index, 2).text(),
  147. "type": self.tableWidget.item(row_index, 3).text(),
  148. "keyword": self.tableWidget.item(row_index, 4).text(),
  149. "action": self.tableWidget.item(row_index, 5).text()
  150. }
  151. dialog = AddInstructionDialog(data)
  152. if dialog.exec_() == QDialog.Accepted:
  153. instruction_data = dialog.get_instruction_data()
  154. # 在这里你应该将instruction_data修改到数据库并刷新表格
  155. db = DatabaseManager()
  156. db.update_command(instruction_data["name"], instruction_data["type"], instruction_data["keyword"],
  157. instruction_data["action"],
  158. self.tableWidget.item(row_index, 1).text())
  159. c_datas = db.fetch_all_commands()
  160. db.__del__()
  161. # 先清空数据,再显示新数据
  162. self.tableWidget.setRowCount(0)
  163. self.show_table(c_datas)
  164. config.local_commands = c_datas
  165. def delete_instruction(self):
  166. """获取选中的行索引"""
  167. row_index = self.tableWidget.currentRow()
  168. if row_index == -1: # 没有选中任何复选框
  169. return None
  170. db = DatabaseManager()
  171. db.delete_command(self.tableWidget.item(row_index, 1).text())
  172. c_datas = db.fetch_all_commands()
  173. db.__del__()
  174. # 先清空数据,再显示新数据
  175. self.tableWidget.setRowCount(0)
  176. self.show_table(c_datas)
  177. config.local_commands = c_datas