QTableWidget
是 PyQt6 中的一个表格控件,用于显示和编辑二维表格数据。它继承自 QTableView
,提供了更简单的方式来处理表格数据,适合用于需要展示结构化数据的场景。
1. 常用方法
1.1 构造函数
-
QTableWidget(parent: QWidget = None)
:创建一个空的表格控件。 -
QTableWidget(rows: int, columns: int, parent: QWidget = None)
:创建一个指定行数和列数的表格控件。
1.2 设置行列数
-
setRowCount(rows: int)
:设置表格的行数。 -
setColumnCount(columns: int)
:设置表格的列数。 -
rowCount() -> int
:获取表格的行数。 -
columnCount() -> int
:获取表格的列数。
1.3 设置表头
-
setHorizontalHeaderLabels(labels: List[str])
:设置水平表头的标签。 -
setVerticalHeaderLabels(labels: List[str])
:设置垂直表头的标签。 -
horizontalHeader() -> QHeaderView
:获取水平表头对象。 -
verticalHeader() -> QHeaderView
:获取垂直表头对象。
1.4 设置单元格内容
-
setItem(row: int, column: int, item: QTableWidgetItem)
:设置指定单元格的内容。 -
item(row: int, column: int) -> QTableWidgetItem
:获取指定单元格的内容。 -
takeItem(row: int, column: int) -> QTableWidgetItem
:移除指定单元格的内容并返回。
1.5 设置单元格属性
-
setCellWidget(row: int, column: int, widget: QWidget)
:在指定单元格中放置一个控件(如按钮、下拉框等)。 -
cellWidget(row: int, column: int) -> QWidget
:获取指定单元格中的控件。 -
setSpan(row: int, column: int, rowSpan: int, columnSpan: int)
:合并单元格。
1.6 选择模式
-
setSelectionMode(mode: QAbstractItemView.SelectionMode)
:设置选择模式(如单选、多选等)。 -
setSelectionBehavior(behavior: QAbstractItemView.SelectionBehavior)
:设置选择行为(如选择行、选择列等)。
1.7 信号
-
cellChanged(row: int, column: int)
:当单元格内容发生变化时触发。 -
cellClicked(row: int, column: int)
:当单元格被点击时触发。 -
cellDoubleClicked(row: int, column: int)
:当单元格被双击时触发。
2. 例子
import os
import sys
import webbrowser
import qt_material
from PyQt6.QtWidgets import *
from PyQt6.QtCore import *
class Window(QWidget):
def __init__(self):
super(Window, self).__init__()
self.resize(400, 300)
self.init_widget()
self.init_signal()
self.init_getdata()
self.init_layout()
def init_widget(self):
# tablewidget
self.table = QTableWidget()
self.table.setColumnCount(2)
self.table.setHorizontalHeaderLabels(['网站', 'Url'])
self.table.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch)
self.table.setAlternatingRowColors(True)
self.table.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers) # 无法编辑
def init_getdata(self):
row_count = self.table.rowCount()
self.table.setRowCount(row_count + 1)
self.table.setItem(0, 0, QTableWidgetItem('百度'))
self.table.setItem(0, 1, QTableWidgetItem('https://www.baidu.com/'))
row_count = self.table.rowCount()
self.table.setRowCount(row_count + 1)
self.table.setItem(1, 0, QTableWidgetItem('腾讯视频'))
self.table.setItem(1, 1, QTableWidgetItem('https://v.qq.com/'))
def init_signal(self):
self.table.cellDoubleClicked.connect(self.open_url) # 双击打开网页
def init_layout(self):
v_layout = QVBoxLayout()
v_layout.addWidget(self.table)
self.setLayout(v_layout)
def open_url(self, row, column):
print(f'{row} {column}')
if int(column) == 1:
url = self.table.item(row, column).text()
webbrowser.open(url)
if __name__ == '__main__':
os.environ["QT_IM_MODULE"] = "ibus" # mac系统解决输入法不兼容
app = QApplication(sys.argv)
qt_material.apply_stylesheet(app, theme='light_pink.xml')
window = Window()
window.show()
sys.exit(app.exec())
3. 总结
优点
-
简单易用:提供了直接操作表格数据的接口。
-
灵活性高:支持动态加载数据、编辑单元格内容和嵌入控件。
-
功能丰富:支持表头设置、单元格合并、选择模式等功能。
适用场景
-
数据展示(如成绩表、库存表)。
-
数据编辑(如员工信息管理、订单管理)。
-
动态数据加载(如数据库查询结果、CSV 文件数据)。