一、话不多说,先看图
本次要实现的是主窗口内添加widget组件,widget内设置成垂直盒布局,然后在布局中添加tableView、PushButton组件
二、看main函数
if __name__ == '__main__':app = QApplication(sys.argv)# 现在这创建 主窗口 (不然会闪退) 不然就继承mainWindow = QMainWindow()mainWindow.setWindowTitle('QMainWindow-QWidget-TableView 测试')mainWindow.resize(500, 400)# 一定要创建个实例出来 要有个 a 名字随便你取a = My_Window(mainWindow)sys.exit(app.exec_())
三、看自己写的 类 My_Window
class My_Window:def __init__(self, mainWindow):# 创建一个 widget 组件widget = QWidget()mainWindow.setCentralWidget(widget)# 创建一个垂直盒布局,并放在widget里面self.vboxlayout = QVBoxLayout(widget)# 函数调用 初始化 tableViewself.tableView_init()# 调用 button 组件初始化函数self.button_init()# 展示主窗口mainWindow.show()def button_init(self):# 创建一个按钮self.button = QPushButton('添加项')# 将按钮添加到垂直盒布局里self.vboxlayout.addWidget(self.button)# 按钮组件连接槽函数self.button.clicked.connect(self.tableView_add)# 创建一个按钮self.button1 = QPushButton('删除项')# 将按钮添加到垂直盒布局里self.vboxlayout.addWidget(self.button1)# 按钮组件连接槽函数self.button1.clicked.connect(self.tableView_del_low)# 创建一个按钮self.button3 = QPushButton('删除有项')# 将按钮添加到垂直盒布局里self.vboxlayout.addWidget(self.button3)# 按钮组件连接槽函数self.button3.clicked.connect(self.tableView_clear)def tableView_init(self):# 创建一个 0行3列 的标准模型self.model = QStandardItemModel(0, 3)# 设置表头标签self.model.setHorizontalHeaderLabels(['姓名', '年龄', '年薪'])# 创建 tableView 组件self.tableview = QTableView()# 将 tableView 添加到垂直盒布局里self.vboxlayout.addWidget(self.tableview)# tableView 组件 设置模型self.tableview.setModel(self.model)self.tableview.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) # 所有列自动拉伸,充满界面self.tableview.setSelectionMode(QAbstractItemView.SingleSelection) # 设置只能选中整行self.tableview.setEditTriggers(QTableView.NoEditTriggers) # 不可编辑self.tableview.setSelectionBehavior(QAbstractItemView.SelectRows) # 设置只能选中一行# self.tableView.setSelectionBehavior(QAbstractItemView.SelectRows) # 设置只能选中整行# self.tableView.setSelectionMode(QAbstractItemView.ExtendedSelection) # 设置只能选中多行def tableView_add(self):print('a')# 写全item1 = QStandardItem('%s' % '小朱')item2 = QStandardItem('%s' % '21')item3 = QStandardItem('%s' % '14w')print('b')self.model.appendRow([item1, item2, item3])print('c')# 简写self.model.appendRow([QStandardItem('%s' % '小明'),QStandardItem('%s' % '20'),QStandardItem('%s' % '15w'),])print('d')def tableView_del_low(self):index = self.tableview.currentIndex() # 取得当前选中行的indexself.model.removeRow(index.row()) # 通过index的row()操作得到行数进行删除def tableView_clear(self):# 会全部清空,包括那个标准表头self.model.clear()# 所以重新设置标准表头 自己将一下代码注释 尝试self.model.setHorizontalHeaderLabels(['姓名', '年龄', '年薪'])
四、完整代码
完整代码就是将 三和四 的代码复制到同一个python文件就行啦
五、关于TableView知识点
# 创建一个 0行3列 的标准模型 self.model = QStandardItemModel(0, 3) # 设置表头标签 self.model.setHorizontalHeaderLabels(['姓名', '年龄', '年薪'])
# 创建 tableView 组件 self.tableview = QTableView() # 将 tableView 添加到垂直盒布局里 self.vboxlayout.addWidget(self.tableview) # tableView 组件 设置模型 self.tableview.setModel(self.model)
self.tableview.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) # 所有列自动拉伸,充满界面 self.tableview.setSelectionMode(QAbstractItemView.SingleSelection) # 设置只能选中整行 self.tableview.setSelectionBehavior(QAbstractItemView.SelectRows) # 设置只能选中一行 self.tableview.setEditTriggers(QTableView.NoEditTriggers) # 不可编辑
self.tableView.setSelectionBehavior(QAbstractItemView.SelectRows) # 设置只能选中整行 self.tableView.setSelectionMode(QAbstractItemView.ExtendedSelection) # 设置只能选中多行
index = self.tableview.currentIndex() # 取得当前选中行的index self.model.removeRow(index.row()) # 通过index的row()操作得到行数进行删除
# 会全部清空,包括那个标准表头 self.model.clear() # 所以重新设置标准表头 自己将一下代码注释 尝试 self.model.setHorizontalHeaderLabels(['姓名', '年龄', '年薪'])
不是唯一写法,有些我也还不知道 self.model.appendRow([QStandardItem('%s' % '小明'),QStandardItem('%s' % '20'),QStandardItem('%s' % '15w'), ])