Pyqt5表格

    xiaoxiao2022-07-14  157

    显示二维表数据(QTableView控件)

    数据源

    Model

    需要创建QTableView实例和一个数据源(Model),然后将两者关联

    MVC:Model Viewer Controller

    MVC的目的是将后端的数据和前端页面的耦合度降低

    ''' from PyQt5.QtWidgets import * from PyQt5.QtGui import * import sys class TableView(QWidget): def __init__(self, arg=None): super(TableView, self).__init__(arg) self.setWindowTitle("QTableView表格视图控件演示") self.resize(500,300); self.model = QStandardItemModel(4,3) self.model.setHorizontalHeaderLabels(['id','姓名','年龄']) self.tableview = QTableView() # 关联QTableView控件和Model self.tableview.setModel(self.model) # 添加数据 item11 = QStandardItem('10') item12 = QStandardItem('雷神') item13 = QStandardItem('2000') self.model.setItem(0,0,item11) self.model.setItem(0,1, item12) self.model.setItem(0,2, item13) item31 = QStandardItem('30') item32 = QStandardItem('死亡女神') item33 = QStandardItem('3000') self.model.setItem(2,0,item31) self.model.setItem(2,1, item32) self.model.setItem(2,2, item33) layout = QVBoxLayout() layout.addWidget(self.tableview) self.setLayout(layout) if __name__ == '__main__': app = QApplication(sys.argv) table = TableView() table.show() sys.exit(app.exec_())

    扩展的表格控件(QTableWidget)

    每一个Cell(单元格)是一个QTableWidgetItem

    import sys from PyQt5.QtWidgets import QWidget, QTableWidget, QHBoxLayout, QApplication, QTableWidgetItem, QAbstractItemView class TableWidgetDemo(QWidget): def __init__(self): super(TableWidgetDemo,self).__init__() self.initUI() def initUI(self): self.setWindowTitle("QTableWidget演示") self.resize(430, 230); layout = QHBoxLayout() tablewidget = QTableWidget() tablewidget.setRowCount(4) tablewidget.setColumnCount(3) layout.addWidget(tablewidget) tablewidget.setHorizontalHeaderLabels(['姓名','年龄','籍贯']) nameItem = QTableWidgetItem("小明") tablewidget.setItem(0,0,nameItem) ageItem = QTableWidgetItem("24") tablewidget.setItem(0,1,ageItem) jgItem = QTableWidgetItem("北京") tablewidget.setItem(0,2,jgItem) # 禁止编辑 tablewidget.setEditTriggers(QAbstractItemView.NoEditTriggers) # 整行选择 tablewidget.setSelectionBehavior(QAbstractItemView.SelectRows) # 调整列和行 tablewidget.resizeColumnsToContents() tablewidget.resizeRowsToContents() tablewidget.horizontalHeader().setVisible(False) tablewidget.setVerticalHeaderLabels(["a","b"]) # 隐藏表格线 tablewidget.setShowGrid(False) self.setLayout(layout) if __name__ == '__main__': app = QApplication(sys.argv) example = TableWidgetDemo() example.show() sys.exit(app.exec_())

    表格中显示上下文菜单

    如何弹出菜单

    如果在满足条件的情况下弹出菜单

    import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import Qt class TableWidgetContextMenu(QWidget): def __init__(self): super(TableWidgetContextMenu,self).__init__() self.initUI() def initUI(self): self.setWindowTitle("在表格中显示上下文菜单") self.resize(500, 300); layout = QHBoxLayout() self.tableWidget = QTableWidget() self.tableWidget.setRowCount(5) self.tableWidget.setColumnCount(3) layout.addWidget(self.tableWidget) self.tableWidget.setHorizontalHeaderLabels(['姓名', '性别', '体重']) newItem = QTableWidgetItem("张三") self.tableWidget.setItem(0, 0, newItem) newItem = QTableWidgetItem("男") self.tableWidget.setItem(0, 1, newItem) newItem = QTableWidgetItem("160") self.tableWidget.setItem(0, 2, newItem) # 表格中第二行记录 newItem = QTableWidgetItem("李四") self.tableWidget.setItem(1, 0, newItem) newItem = QTableWidgetItem("女") self.tableWidget.setItem(1, 1, newItem) newItem = QTableWidgetItem("170") self.tableWidget.setItem(1, 2, newItem) # 表格中第二行记录 newItem = QTableWidgetItem("李") self.tableWidget.setItem(2, 0, newItem) newItem = QTableWidgetItem("女") self.tableWidget.setItem(2, 1, newItem) newItem = QTableWidgetItem("170") self.tableWidget.setItem(2, 2, newItem) self.tableWidget.setContextMenuPolicy(Qt.CustomContextMenu) self.tableWidget.customContextMenuRequested.connect(self.generateMenu) self.setLayout(layout) def generateMenu(self,pos): print(pos) for i in self.tableWidget.selectionModel().selection().indexes(): rowNum = i.row() # 如果选择的行索引小于2,弹出上下文菜单 if rowNum < 2: menu = QMenu() item1 = menu.addAction("菜单项1") item2 = menu.addAction("菜单项2") item3 = menu.addAction("菜单项3") screenPos = self.tableWidget.mapToGlobal(pos) print(screenPos) # 被阻塞 action = menu.exec(screenPos) if action == item1: print('选择了第1个菜单项',self.tableWidget.item(rowNum,0).text(), self.tableWidget.item(rowNum,1).text(), self.tableWidget.item(rowNum, 2).text()) elif action == item2: print('选择了第2个菜单项',self.tableWidget.item(rowNum,0).text(), self.tableWidget.item(rowNum,1).text(), self.tableWidget.item(rowNum, 2).text()) elif action == item3: print('选择了第3个菜单项',self.tableWidget.item(rowNum,0).text(), self.tableWidget.item(rowNum,1).text(), self.tableWidget.item(rowNum, 2).text()) else: return if __name__ == '__main__': app = QApplication(sys.argv) example = TableWidgetContextMenu() example.show() sys.exit(app.exec_())

    刘润森! 认证博客专家 Python Java 前端 17年就读于东莞XX学院化学工程与工艺专业,GitChat作者。Runsen的微信公众号是"Python之王",因为Python入了IT的坑,从此不能自拔。公众号内容涉及Python,Java计算机、杂谈。干货与情怀同在。喜欢的微信搜索:「Python之王」。个人微信号:RunsenLiu。不关注我公号一律拉黑!!!
    最新回复(0)