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