导入
QTableWidget 类
了解我们在应用程序中如何使用 QTableWidget 类。
1import sys 2from PyQt6.QtWidgets import (QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QMenu, QInputDialog) 3from PyQt6.QtGui import QAction
1class SpreadsheetFramework(QMainWindow): 2 def __init__(self): 3 super().__init__() 4 self.initUI() 5 6 def initUI(self): 7 self.setMinimumSize(1000, 500) 8 self.setWindowTitle("Spreadsheet - Table Example") 9 # 用于复制和粘贴操作 10 self.item_text = None 11 self.createMenu() 12 self.createTable() 13 self.show() 14 15 def createTable(self): 16 """ 17 设置表格控件。 18 """ 19 self.table_widget = QTableWidget() 20 # 设置初始行数和列数 21 self.table_widget.setRowCount(10) 22 self.table_widget.setColumnCount(10) 23 # 将焦点设置在表格的第一个单元格 24 self.table_widget.setCurrentCell(0, 0) 25 # 当水平表头被双击时,发出信号 26 self.table_widget.horizontalHeader().sectionDoubleClicked.connect(self.changeHeader) 27 self.setCentralWidget(self.table_widget) 28 29 def createMenu(self): 30 """ 31 设置菜单栏。 32 """ 33 # 创建文件菜单项 34 quit_act = QAction("退出", self) 35 quit_act.setShortcut('Ctrl+Q') 36 quit_act.triggered.connect(self.close) 37 # 创建表格菜单项 38 self.add_row_above_act = QAction("在上方添加行", self) 39 self.add_row_above_act.triggered.connect(self.addRowAbove) 40 self.add_row_below_act = QAction("在下方添加行", self) 41 self.add_row_below_act.triggered.connect(self.addRowBelow) 42 self.add_col_before_act = QAction("在前面添加列", self) 43 self.add_col_before_act.triggered.connect(self.addColumnBefore) 44 self.add_col_after_act = QAction("在后面添加列", self) 45 self.add_col_after_act.triggered.connect(self.addColumnAfter) 46 self.delete_row_act = QAction("删除行", self) 47 self.delete_row_act.triggered.connect(self.deleteRow) 48 self.delete_col_act = QAction("删除列", self) 49 self.delete_col_act.triggered.connect(self.deleteColumn) 50 self.clear_table_act = QAction("清空全部", self) 51 self.clear_table_act.triggered.connect(self.clearTable) 52 # 创建菜单栏 53 menu_bar = self.menuBar() 54 menu_bar.setNativeMenuBar(False) 55 # 创建文件菜单并添加动作 56 file_menu = menu_bar.addMenu('文件') 57 file_menu.addAction(quit_act) 58 # 创建表格菜单并添加动作 59 table_menu = menu_bar.addMenu('表格') 60 table_menu.addAction(self.add_row_above_act) 61 table_menu.addAction(self.add_row_below_act) 62 table_menu.addSeparator() 63 table_menu.addAction(self.add_col_before_act) 64 table_menu.addAction(self.add_col_after_act) 65 table_menu.addSeparator() 66 table_menu.addAction(self.delete_row_act) 67 table_menu.addAction(self.delete_col_act) 68 table_menu.addSeparator() 69 table_menu.addAction(self.clear_table_act) 70 71 def contextMenuEvent(self, event): 72 """ 73 创建上下文菜单和动作。 74 """ 75 context_menu = QMenu(self) 76 context_menu.addAction(self.add_row_above_act) 77 context_menu.addAction(self.add_row_below_act) 78 context_menu.addSeparator() 79 context_menu.addAction(self.add_col_before_act) 80 context_menu.addAction(self.add_col_after_act) 81 context_menu.addSeparator() 82 context_menu.addAction(self.delete_row_act) 83 context_menu.addAction(self.delete_col_act) 84 context_menu.addSeparator() 85 copy_act = context_menu.addAction("复制") 86 paste_act = context_menu.addAction("粘贴") 87 context_menu.addSeparator() 88 context_menu.addAction(self.clear_table_act) 89 # 执行上下文菜单并返回选中的动作。mapToGlobal 将窗口坐标转换为全局屏幕坐标,以便检测右键点击是否发生在 GUI 内部,并显示上下文菜单。 90 action = context_menu.exec_(self.mapToGlobal(event.pos())) 91 # 检查在上下文菜单中选择的动作是否未在菜单栏中创建。 92 if action == copy_act: 93 self.copyItem() 94 if action == paste_act: 95 self.pasteItem() 96 97 def changeHeader(self): 98 """ 99 通过输入对话框获取文本来更改水平表头。 100 """ 101 col = self.table_widget.currentColumn() 102 text, ok = QInputDialog.getText(self, "输入表头", "表头文本:") 103 if ok and text != "": 104 self.table_widget.setHorizontalHeaderItem(col, 105 QTableWidgetItem(text)) 106 else: 107 pass 108 109 def copyItem(self): 110 """ 111 如果当前选中的单元格不为空,则保存其文本内容。 112 """ 113 if self.table_widget.currentItem() != None: 114 self.item_text = self.table_widget.currentItem().text() 115 116 def pasteItem(self): 117 """ 118 设置选中单元格的内容。 119 """ 120 if self.item_text != None: 121 row = self.table_widget.currentRow() 122 column = self.table_widget.currentColumn() 123 self.table_widget.setItem(row, column, QTableWidgetItem(self.item_text)) 124 125 def addRowAbove(self): 126 current_row = self.table_widget.currentRow() 127 self.table_widget.insertRow(current_row) 128 129 def addRowBelow(self): 130 current_row = self.table_widget.currentRow() 131 self.table_widget.insertRow(current_row + 1) 132 133 def addColumnBefore(self): 134 current_col = self.table_widget.currentColumn() 135 self.table_widget.insertColumn(current_col) 136 137 def addColumnAfter(self): 138 current_col = self.table_widget.currentColumn() 139 self.table_widget.insertColumn(current_col + 1) 140 141 def deleteRow(self): 142 current_row = self.table_widget.currentRow() 143 self.table_widget.removeRow(current_row) 144 145 def deleteColumn(self): 146 current_col = self.table_widget.currentColumn() 147 self.table_widget.removeColumn(current_col) 148 149 def clearTable(self): 150 self.table_widget.clear()
1if __name__ == "__main__": 2 app = QApplication(sys.argv) 3 window = SpreadsheetFramework() 4 sys.exit(app.exec())