一、话不多说,先看图

本次要实现的是主窗口内添加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)

        # 函数调用 初始化 tableView
        self.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()  # 取得当前选中行的index
        self.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'),
])

 

 

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐