Qt 列表与表格控件 #
控件概览 #
text
┌─────────────────────────────────────────────────────────────┐
│ Qt 列表/表格控件 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 基于项的控件(简单易用): │
│ ├── QListWidget - 列表控件 │
│ ├── QTableWidget - 表格控件 │
│ └── QTreeWidget - 树形控件 │
│ │
│ 基于模型的控件(灵活强大): │
│ ├── QListView - 列表视图 │
│ ├── QTableView - 表格视图 │
│ └── QTreeView - 树形视图 │
│ │
└─────────────────────────────────────────────────────────────┘
QListWidget 列表控件 #
基本使用 #
cpp
QListWidget *listWidget = new QListWidget(this);
// 添加项目
listWidget->addItem("Item 1");
listWidget->addItem("Item 2");
listWidget->addItem("Item 3");
// 批量添加
QStringList items = {"A", "B", "C", "D"};
listWidget->addItems(items);
// 插入项目
listWidget->insertItem(0, "First Item");
// 带图标的项
listWidget->addItem(new QListWidgetItem(QIcon(":/icon.png"), "Icon Item"));
// 删除项目
delete listWidget->takeItem(0); // 删除并返回第一项
listWidget->clear(); // 清空所有
// 获取项目数量
int count = listWidget->count();
// 获取项目
QListWidgetItem *item = listWidget->item(0);
QString text = item->text();
选择与交互 #
cpp
// 设置选择模式
listWidget->setSelectionMode(QAbstractItemView::SingleSelection); // 单选
listWidget->setSelectionMode(QAbstractItemView::MultiSelection); // 多选
listWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); // 扩展选择
listWidget->setSelectionMode(QAbstractItemView::NoSelection); // 不可选
// 获取当前选中项
QListWidgetItem *current = listWidget->currentItem();
int currentRow = listWidget->currentRow();
// 获取所有选中项
QList<QListWidgetItem*> selected = listWidget->selectedItems();
// 设置当前选中
listWidget->setCurrentRow(0);
listWidget->setCurrentItem(item);
// 连接信号
connect(listWidget, &QListWidget::itemClicked, [](QListWidgetItem *item) {
qDebug() << "Clicked:" << item->text();
});
connect(listWidget, &QListWidget::itemDoubleClicked, [](QListWidgetItem *item) {
qDebug() << "Double clicked:" << item->text();
});
connect(listWidget, &QListWidget::currentRowChanged, [](int row) {
qDebug() << "Current row:" << row;
});
自定义项目 #
cpp
// 创建自定义项目
QListWidgetItem *item = new QListWidgetItem;
// 设置文本
item->setText("Custom Item");
// 设置图标
item->setIcon(QIcon(":/icon.png"));
// 设置提示
item->setToolTip("This is a tooltip");
item->setStatusTip("Status tip");
// 设置对齐
item->setTextAlignment(Qt::AlignCenter);
// 设置字体
item->setFont(QFont("Arial", 12, QFont::Bold));
// 设置前景/背景色
item->setForeground(Qt::red);
item->setBackground(Qt::yellow);
// 设置复选框
item->setCheckState(Qt::Checked);
item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
// 设置用户数据
item->setData(Qt::UserRole, 42); // 存储任意数据
int data = item->data(Qt::UserRole).toInt();
// 设置标志
item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable);
listWidget->addItem(item);
QTableWidget 表格控件 #
基本使用 #
cpp
QTableWidget *tableWidget = new QTableWidget(this);
// 设置行列数
tableWidget->setRowCount(5);
tableWidget->setColumnCount(3);
// 设置表头
tableWidget->setHorizontalHeaderLabels({"Name", "Age", "City"});
tableWidget->setVerticalHeaderLabels({"1", "2", "3", "4", "5"});
// 隐藏表头
tableWidget->verticalHeader()->setVisible(false);
// 设置单元格内容
tableWidget->setItem(0, 0, new QTableWidgetItem("Alice"));
tableWidget->setItem(0, 1, new QTableWidgetItem("25"));
tableWidget->setItem(0, 2, new QTableWidgetItem("Beijing"));
// 设置单元格控件
QComboBox *combo = new QComboBox;
combo->addItems({"Male", "Female"});
tableWidget->setCellWidget(1, 1, combo);
// 插入行/列
tableWidget->insertRow(0);
tableWidget->insertColumn(0);
// 删除行/列
tableWidget->removeRow(0);
tableWidget->removeColumn(0);
// 清空内容
tableWidget->clear(); // 清空所有
tableWidget->clearContents(); // 清空内容,保留表头
表格样式 #
cpp
// 设置选择行为
tableWidget->setSelectionBehavior(QAbstractItemView::SelectItems); // 选择单元格
tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); // 选择整行
tableWidget->setSelectionBehavior(QAbstractItemView::SelectColumns); // 选择整列
// 设置选择模式
tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);
// 设置编辑触发
tableWidget->setEditTriggers(QAbstractItemView::DoubleClicked);
tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); // 不可编辑
// 交替行颜色
tableWidget->setAlternatingRowColors(true);
// 调整列宽
tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive); // 可交互
tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); // 自动拉伸
tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents); // 根据内容
// 固定列宽
tableWidget->setColumnWidth(0, 150);
// 隐藏列
tableWidget->setColumnHidden(1, true);
// 排序
tableWidget->setSortingEnabled(true);
tableWidget->sortByColumn(0, Qt::AscendingOrder);
单元格操作 #
cpp
// 获取单元格
QTableWidgetItem *item = tableWidget->item(0, 0);
if (item) {
QString text = item->text();
}
// 获取当前单元格
int row = tableWidget->currentRow();
int col = tableWidget->currentColumn();
QTableWidgetItem *current = tableWidget->currentItem();
// 遍历所有单元格
for (int row = 0; row < tableWidget->rowCount(); ++row) {
for (int col = 0; col < tableWidget->columnCount(); ++col) {
QTableWidgetItem *item = tableWidget->item(row, col);
if (item) {
qDebug() << row << col << item->text();
}
}
}
// 连接信号
connect(tableWidget, &QTableWidget::cellClicked, [](int row, int col) {
qDebug() << "Cell clicked:" << row << col;
});
connect(tableWidget, &QTableWidget::cellChanged, [](int row, int col) {
qDebug() << "Cell changed:" << row << col;
});
QTreeWidget 树形控件 #
基本使用 #
cpp
QTreeWidget *treeWidget = new QTreeWidget(this);
// 设置列数
treeWidget->setColumnCount(2);
// 设置表头
treeWidget->setHeaderLabels({"Name", "Description"});
// 添加顶级项目
QTreeWidgetItem *topItem1 = new QTreeWidgetItem(treeWidget);
topItem1->setText(0, "Root 1");
topItem1->setText(1, "Description 1");
QTreeWidgetItem *topItem2 = new QTreeWidgetItem(treeWidget);
topItem2->setText(0, "Root 2");
// 添加子项目
QTreeWidgetItem *child1 = new QTreeWidgetItem(topItem1);
child1->setText(0, "Child 1");
child1->setText(1, "Child desc 1");
QTreeWidgetItem *child2 = new QTreeWidgetItem(topItem1);
child2->setText(0, "Child 2");
// 添加子项目的子项目
QTreeWidgetItem *subChild = new QTreeWidgetItem(child1);
subChild->setText(0, "Sub Child");
// 展开/折叠
treeWidget->expandAll(); // 展开所有
treeWidget->collapseAll(); // 折叠所有
topItem1->setExpanded(true); // 展开特定项
项目操作 #
cpp
// 获取顶级项目
QTreeWidgetItem *top = treeWidget->topLevelItem(0);
int topLevelCount = treeWidget->topLevelItemCount();
// 获取当前项目
QTreeWidgetItem *current = treeWidget->currentItem();
// 获取父项目
QTreeWidgetItem *parent = current->parent();
// 获取子项目
int childCount = current->childCount();
QTreeWidgetItem *child = current->child(0);
// 获取项目索引
int index = treeWidget->indexOfTopLevelItem(top);
// 删除项目
delete treeWidget->takeTopLevelItem(0);
delete current->takeChild(0);
// 查找项目
QList<QTreeWidgetItem*> items = treeWidget->findItems("text", Qt::MatchExactly, 0);
项目样式 #
cpp
QTreeWidgetItem *item = new QTreeWidgetItem();
// 设置文本
item->setText(0, "Name");
item->setText(1, "Description");
// 设置图标
item->setIcon(0, QIcon(":/folder.png"));
// 设置复选框
item->setCheckState(0, Qt::Checked);
// 设置字体
item->setFont(0, QFont("Arial", 10, QFont::Bold));
// 设置前景/背景色
item->setForeground(0, Qt::blue);
item->setBackground(0, Qt::lightGray);
// 设置对齐
item->setTextAlignment(1, Qt::AlignCenter);
// 设置提示
item->setToolTip(0, "Tooltip text");
// 设置用户数据
item->setData(0, Qt::UserRole, QVariant::fromValue(myData));
信号处理 #
cpp
// 项目点击
connect(treeWidget, &QTreeWidget::itemClicked, [](QTreeWidgetItem *item, int column) {
qDebug() << "Clicked:" << item->text(0) << column;
});
// 项目双击
connect(treeWidget, &QTreeWidget::itemDoubleClicked, [](QTreeWidgetItem *item, int column) {
qDebug() << "Double clicked:" << item->text(0);
});
// 当前项目改变
connect(treeWidget, &QTreeWidget::currentItemChanged, [](QTreeWidgetItem *current, QTreeWidgetItem *previous) {
if (current) {
qDebug() << "Current:" << current->text(0);
}
});
// 项目展开/折叠
connect(treeWidget, &QTreeWidget::itemExpanded, [](QTreeWidgetItem *item) {
qDebug() << "Expanded:" << item->text(0);
});
connect(treeWidget, &QTreeWidget::itemCollapsed, [](QTreeWidgetItem *item) {
qDebug() << "Collapsed:" << item->text(0);
});
右键菜单 #
cpp
// 启用右键菜单
listWidget->setContextMenuPolicy(Qt::CustomContextMenu);
// 连接信号
connect(listWidget, &QListWidget::customContextMenuRequested, [=](const QPoint &pos) {
QMenu menu;
menu.addAction("Add Item", [=]() {
listWidget->addItem("New Item");
});
QListWidgetItem *item = listWidget->itemAt(pos);
if (item) {
menu.addAction("Delete Item", [=]() {
delete listWidget->takeItem(listWidget->row(item));
});
menu.addAction("Edit Item", [=]() {
listWidget->editItem(item);
});
}
menu.exec(listWidget->mapToGlobal(pos));
});
拖放支持 #
cpp
// 启用拖放
listWidget->setDragEnabled(true);
listWidget->setAcceptDrops(true);
listWidget->setDropIndicatorShown(true);
listWidget->setDragDropMode(QAbstractItemView::InternalMove); // 内部移动
// 拖放模式
QAbstractItemView::NoDragDrop // 禁用拖放
QAbstractItemView::DragOnly // 只能拖出
QAbstractItemView::DropOnly // 只能放入
QAbstractItemView::DragDrop // 可拖可放
QAbstractItemView::InternalMove // 内部移动
下一步 #
现在你已经掌握了列表和表格控件,接下来学习 容器控件,了解如何组织和管理界面内容!
最后更新:2026-03-29