PyQt / PySide (推荐功能最强大的方案)
PyQt 和 PySide 提供了非常强大和灵活的表格控件 QTableView,要设置表头,你需要理解其 Model-View (模型-视图) 架构。

QTableView: 是视图,负责数据的显示和交互。QAbstractTableModel/QStandardItemModel: 是模型,负责存储和管理数据。- 表头 是模型的一部分,视图从模型中获取表头信息来显示。
核心步骤:
- 创建一个模型 (
QStandardItemModel是最简单易用的)。 - 为模型设置表头:使用
setHorizontalHeaderLabels()或setHeaderData()。 - 将数据添加到模型。
- 创建一个视图 (
QTableView)。 - 将模型设置给视图:
tableView.setModel(model)。
示例代码:PyQt6 / PySide6
这是最现代和推荐的方式,代码在 PyQt6 和 PySide6 中基本通用。
import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QTableView, QVBoxLayout, QWidget
from PyQt6.QtGui import QStandardItemModel, QStandardItem
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("PyQt Table Header 示例")
self.setGeometry(300, 300, 500, 300)
# 1. 创建模型
# 参数: 行数, 列数
model = QStandardItemModel(4, 3)
# 2. 设置表头
# setHorizontalHeaderLabels 接受一个字符串列表
headers = ["姓名", "年龄", "城市"]
model.setHorizontalHeaderLabels(headers)
# 3. 为模型设置数据 (可选)
# 创建一些标准项并添加到模型中
data = [
["张三", "28", "北京"],
["李四", "32", "上海"],
["王五", "24", "广州"],
["赵六", "45", "深圳"]
]
for row in range(data.__len__()):
for col in range(data[row].__len__()):
item = QStandardItem(data[row][col])
model.setItem(row, col, item)
# 4. 创建视图
table_view = QTableView()
# 5. 将模型设置给视图
table_view.setModel(model)
# --- 高级表头操作 ---
# 修改特定列的表头
model.setHeaderData(0, 1, "ID", 1) # 参数: 列索引, 方向(Qt.Horizontal/Vertical), 新文本, 角色
model.setHeaderData(1, 1, "年龄", 1)
# 设置表头字体
font = table_view.horizontalHeader().font()
font.setBold(True)
table_view.horizontalHeader().setFont(font)
# 设置表头对齐方式
table_view.horizontalHeader().setDefaultAlignment(
int(table_view.horizontalHeader().alignment() | 0x0004) # Qt.AlignHCenter
)
# 允许表头点击排序
table_view.setSortingEnabled(True)
# 设置布局
central_widget = QWidget()
layout = QVBoxLayout()
layout.addWidget(table_view)
central_widget.setLayout(layout)
self.setCentralWidget(central_widget)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
关键点解析:
setHorizontalHeaderLabels(headers): 一次性设置所有水平表头,这是最常用的方法。setHeaderData(section, orientation, data, role=Qt.ItemDataRole.EditRole): 更灵活的方法。section: 行或列的索引。orientation:Qt.Orientation.Horizontal或Qt.Orientation.Vertical。data: 要设置的新数据(文本、图标等)。role: 数据的角色,Qt.ItemDataRole.DisplayRole(默认,用于显示文本) 或Qt.ItemDataRole.ToolTipRole(用于提示文本)。
horizontalHeader(): 获取水平表头的对象 (QHeaderView),你可以通过这个对象来修改表头的各种属性,如字体、对齐方式、是否可点击、是否可见等。verticalHeader(): 同理,获取垂直表头的对象。
Tkinter (Python 内置方案)
Tkinter 的 ttk.Treeview 控件也可以用来创建类似表格的视图,并支持表头。
核心步骤:
- 创建
ttk.Treeview接口。 - 使用
columns参数指定列名。 - 使用
heading()方法设置表头显示的文本。 - 使用
insert()方法添加数据行。
示例代码:Tkinter
import tkinter as tk
from tkinter import ttk
def create_table():
# 创建主窗口
root = tk.Tk()
root.title("Tkinter Table Header 示例")
root.geometry("400x300")
# 1. 创建 Treeview 接口
# columns 定义了有哪些列,这里我们定义了三列
# 我们给第一列留空,让它成为默认的树形列
tree = ttk.Treeview(root, columns=("name", "age", "city"), show="headings")
# 2. 设置列的标题 (表头)
# heading() 方法用于设置表头文本
# "name", "age", "city" 是我们上面定义的列标识符
tree.heading("name", text="姓名")
tree.heading("age", text="年龄")
tree.heading("city", text="城市")
# 3. 设置列的宽度 (可选)
tree.column("name", width=100, anchor="center")
tree.column("age", width=80, anchor="center")
tree.column("city", width=100, anchor="w") # w = west, 左对齐
# 4. 添加数据
data = [
("张三", "28", "北京"),
("李四", "32", "上海"),
("王五", "24", "广州"),
("赵六", "45", "深圳")
]
for item in data:
tree.insert("", "end", values=item) # "" 表示顶级节点, "end" 表示追加到最后
# --- 高级表头操作 ---
# 修改表头文本
tree.heading("name", text="ID")
# 为表头添加点击事件 (例如排序)
def on_heading_click(event):
# 这里可以添加排序逻辑
print(f"点击了表头: {tree.identify_column(event.x)}")
# tree.identify_column(event.x) 会返回类似 '#1', '#2' 的列ID
tree.bind("<Button-1>", on_heading_click)
# 添加滚动条 (可选)
scrollbar = ttk.Scrollbar(root, orient="vertical", command=tree.yview)
tree.configure(yscrollcommand=scrollbar.set)
scrollbar.pack(side="right", fill="y")
tree.pack(expand=True, fill="both", padx=10, pady=10)
root.mainloop()
if __name__ == '__main__':
create_table()
关键点解析:
columns=("name", "age", "city"): 在创建Treeview时定义列,这些字符串是每一列的唯一标识符。tree.heading("column_id", text="显示文本"): 这是设置表头文本的核心方法,第一个参数是列的 ID,第二个参数是显示的文本。tree.column("column_id", ...): 用于设置列的属性,如宽度 (width) 和对齐方式 (anchor,可选值为e,w,center等)。show="headings": 这个选项非常重要,它会隐藏默认的树形列(第一列的空白列),只显示我们定义的带表头的列,如果省略,会显示一个可以折叠的空白列。
总结与对比
| 特性 | PyQt / PySide (QTableView) |
Tkinter (ttk.Treeview) |
|---|---|---|
| 架构 | Model-View (模型-视图),数据与显示分离,非常强大。 | Widget-based (控件基础),数据直接与控件关联,相对简单。 |
| 表头设置 | 通过 model.setHorizontalHeaderLabels() 或 model.setHeaderData() 设置。 |
通过 tree.heading("column_id", text="...") 直接设置。 |
| 数据填充 | 通过 model.setItem(row, col, item) 填充。 |
通过 tree.insert("", "end", values=(...)) 填充。 |
| 功能 | 功能极其丰富:排序、筛选、代理模型、复杂编辑、自定义委托等。 | 功能相对基础:支持排序、滚动,但高级功能需要自己实现。 |
| 学习曲线 | 较陡峭,需要理解 Model-View 概念。 | 较平缓,对于简单表格上手很快。 |
| 依赖 | 需要安装第三方库 (pip install PyQt6 或 pip install PySide6)。 |
Python 内置库,无需安装。 |
如何选择?
- 如果你要开发复杂的桌面应用程序,需要表格有高级功能(如高性能、排序、过滤、编辑),或者你正在使用 Qt 框架,强烈推荐 PyQt/PySide。
- 如果你只是需要一个简单的数据展示,或者想快速实现一个带表头的表格,且不希望引入外部依赖,Tkinter 是一个很好的选择。

