QT(QTableWidget)

QT6


QTableWidget

QTableWidget是一种Item Widget组件,它以表格形式和管理数据,表格的每个单元格关联一个QTableWidgetItem对象,可以设置每个单元格的文字内容、字体、文字颜色、背景色、图标等,还可以有复选框。每个单元格还可以存储用户数据

常用属性和方法

Qt6中QTableWidget常用属性和方法

行列操作

类别 属性/方法 说明
setRowCount(int rows) 设置表格的行数
setColumnCount(int columns) 设置表格的列数
rowCount() const 获取当前行数
columnCount() const 获取当前列数
insertRow(int row) 在指定位置插入新行
insertColumn(int column) 在指定位置插入新列
removeRow(int row) 移除指定行
removeColumn(int column) 移除指定列

表头设置

属性/方法 说明
setHorizontalHeaderLabels(const QStringList &labels) 设置水平表头的标签文本
setVerticalHeaderLabels(const QStringList &labels) 设置垂直表头的标签文本
horizontalHeader() const 获取水平表头对象
verticalHeader() const 获取垂直表头对象
setHorizontalHeaderItem(int column, QTableWidgetItem *item) 设置水平表头项目
setVerticalHeaderItem(int row, QTableWidgetItem *item) 设置垂直表头项目

单元格操作

属性/方法 说明
setItem(int row, int column, QTableWidgetItem *item) 在指定位置设置单元格项目
item(int row, int column) const 获取指定位置的单元格项目
takeItem(int row, int column) 移除并返回指定位置的单元格项目
setCellWidget(int row, int column, QWidget *widget) 在指定单元格中放置控件
cellWidget(int row, int column) const 获取指定单元格中的控件
setCurrentCell(int row, int column) 设置当前选中的单元格
currentRow() const 获取当前选中行的索引
currentColumn() const 获取当前选中列的索引
selectedItems() const 获取所有选中的项目列表
selectedRanges() const 获取所有选中的范围列表

外观与行为

属性/方法 说明
setEditTriggers(QAbstractItemView::EditTriggers triggers) 设置单元格编辑触发条件
setSelectionBehavior(QAbstractItemView::SelectionBehavior behavior) 设置选择行为
setSelectionMode(QAbstractItemView::SelectionMode mode) 设置选择模式
setShowGrid(bool show) 设置是否显示网格线
setGridStyle(Qt::PenStyle style) 设置网格线样式
setSpan(int row, int column, int rowSpan, int columnSpan) 合并单元格
setAlternatingRowColors(bool enable) 设置是否交替行颜色
setSortingEnabled(bool enable) 设置是否启用排序
sortByColumn(int column, Qt::SortOrder order) 按指定列排序

布局调整

属性/方法 说明
resizeColumnsToContents() 调整列宽以适应内容
resizeRowsToContents() 调整行高以适应内容
horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeMode mode) 设置水平表头的列宽调整模式
verticalHeader()->setSectionResizeMode(QHeaderView::ResizeMode mode) 设置垂直表头的行高调整模式
setColumnWidth(int column, int width) 设置指定列的宽度
setRowHeight(int row, int height) 设置指定行的高度

信号

属性/方法 说明
cellClicked(int row, int column) 单元格被点击时触发
cellDoubleClicked(int row, int column) 单元格被双击时触发
cellChanged(int row, int column) 单元格内容变化时触发
cellActivated(int row, int column) 单元格被激活时触发
cellEntered(int row, int column) 鼠标进入单元格时触发
cellPressed(int row, int column) 单元格被按下时触发
currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn) 当前单元格变化时触发

样式设置

属性/方法 说明
setStyleSheet(const QString &styleSheet) 设置样式表
setFrameShape(QFrame::Shape shape) 设置外边框形状
setFrameShadow(QFrame::Shadow shadow) 设置外边框阴影效果
setLineWidth(int width) 设置线宽
setMidLineWidth(int width) 设置中线宽度

代码测试

cpp 复制代码
#include "mainwindow.h"
#include "./ui_mainwindow.h"
#include <QDebug>
#include <QString>
#include <QTableWidgetItem>
#include <QRandomGenerator>
#include <QDate>
#include <QVariant>
#include <QTableWidget>
#include <QLabel>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->tableWidget->setShowGrid(false);
    labCellIndex = new QLabel("当前单元坐标:",this);
    labCellIndex->setMinimumWidth(240);
    labCellType = new QLabel("当前单元格类型:",this);
    labCellType->setMinimumWidth(200);
    labStudId = new QLabel("当前学生ID:");
    labStudId->setMinimumWidth(200);
    ui->statusBar->addWidget(labCellIndex);
    ui->statusBar->addWidget(labCellType);
    ui->statusBar->addPermanentWidget(labStudId);
}

MainWindow::~MainWindow()
{
    delete ui;
}



void MainWindow::on_btnSetHeader_clicked()
{
    QStringList headText;
    headText << "姓名"<<"性别"<<"出生时间"<<"民族"<<"分数"<<"是否党员";
    ui->tableWidget->setColumnCount(headText.count());
    // ui->tableWidget->setHorizontalHeaderItem(headText)
    for(int i = 0; i < ui->tableWidget->columnCount() ; i++){
        QTableWidgetItem* headItem = new QTableWidgetItem(headText.at(i));
        QFont font = headItem->font();
        font.setBold(true);
        font.setPointSize(11);
        headItem->setFont(font);
        headItem->setForeground(QBrush(Qt::red));
        ui->tableWidget->setHorizontalHeaderItem(i,headItem);

    }
}


void MainWindow::on_btnSetLine_clicked()
{
    ui->tableWidget->setRowCount(ui->spinBox->value());
}


void MainWindow::on_btnInitTable_clicked()
{
    ui->tableWidget->clearContents();
    QDate birth(2000,2,2);
    for(int i = 0 ; i < ui->tableWidget->rowCount() ; i++){
        QString strName = QString("学生%1").arg(i);
        QString strSex = (i%2)?"男生":"女生";
        bool isParty = (i%2)?false:true;
        // 生成60-100之间的分数
        int score = QRandomGenerator::global()->bounded(60,101);
        createItemsARos(i,strName,strSex,birth,"汉族",isParty,score);
        birth = birth.addDays(1);
    }
}

void MainWindow::createItemsARos(int rowNo, QString name, QString sex, QDate birth, QString nation, bool isPm, int score)
{
    uint studID = 20221000;
    QTableWidgetItem* item = new QTableWidgetItem(name,ctName);
    item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
    studID += rowNo;
    item->setData(Qt::UserRole,QVariant(studID));
    ui->tableWidget->setItem(rowNo,colName,item);

    QIcon icon(":/icon/C:/Users/BananaLi/Desktop/QT相关/图标/煎蛋.png");
    QIcon icon2(":/icon/C:/Users/BananaLi/Desktop/QT相关/图标/牛奶.png");
    item = new QTableWidgetItem(sex,ctSex);
    item->setIcon(sex=="男生"?icon:icon2);
    item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled);
    item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
    ui->tableWidget->setItem(rowNo,colSex,item);

    item = new QTableWidgetItem(birth.toString("yyyy-MM-dd"),ctBirth);
    item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
    ui->tableWidget->setItem(rowNo,colBirth,item);

    item = new QTableWidgetItem(nation,ctNation);
    item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
    ui->tableWidget->setItem(rowNo,ColNation,item);

    item = new QTableWidgetItem("党员",ctPartyM);
    item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled|Qt::ItemIsUserCheckable);
    item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
    item->setCheckState(isPm?Qt::Checked:Qt::Unchecked);
    item->setBackground(QBrush(Qt::yellow));
    ui->tableWidget->setItem(rowNo,ColPartyM,item);

    item = new QTableWidgetItem(QString::number(score),ctScore);
    item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
    ui->tableWidget->setItem(rowNo,ColScore,item);

}


void MainWindow::on_btnInsertLine_clicked()
{
    // 获取当前行
    int curRow = ui->tableWidget->currentRow();

    ui->tableWidget->insertRow(curRow);
    createItemsARos(curRow,"新学生","男生",QDate::fromString("2025-1-1","yyyy-M-d"),"汉族",false,79);
}


void MainWindow::on_btnAddLine_clicked()
{
    // 获行数
    int curRow = ui->tableWidget->rowCount();
    ui->tableWidget->insertRow(curRow);
    createItemsARos(curRow,"老同学","女生",QDate::fromString("2025-2-2","yyyy-M-d"),"汉族",true,80);
}


void MainWindow::on_btnDelLine_clicked()
{

    int curRow = ui->tableWidget->currentRow();
    ui->tableWidget->removeRow(curRow);

}


void MainWindow::on_btnAutoLineH_clicked()
{
    ui->tableWidget->resizeRowsToContents();
}


void MainWindow::on_btnAutoLineW_clicked()
{
    ui->tableWidget->resizeColumnsToContents();
}


void MainWindow::on_btnRideToEdit_clicked()
{

    QTableWidgetItem* item = new QTableWidgetItem();
    ui->plainTextEdit->clear();
    for(int i = 0; i< ui->tableWidget->rowCount();i++){
        QString str = QString::asprintf("第%d行",i+1);
        for(int j = 0;j < ui->tableWidget->columnCount()-1;j++){
            item = ui->tableWidget->item(i,j);
            str+=item->text()+" ";
        }
        item = ui->tableWidget->item(i,ColPartyM);
        if(item->checkState() == Qt::Checked){
            str+="党员";
        }else{
            str+="群众";
        }
        ui->plainTextEdit->appendPlainText(str);
    }

}


void MainWindow::on_checkBoxEditable_clicked(bool checked)
{
    if(checked){
        ui->tableWidget->setEditTriggers(QAbstractItemView::DoubleClicked|QAbstractItemView::SelectedClicked);
    }else{
        ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
    }
}


void MainWindow::on_checkBoxLowColor_clicked(bool checked)
{
    ui->tableWidget->setAlternatingRowColors(checked);
}


void MainWindow::on_checkBoxDisplayHeader_clicked(bool checked)
{
    ui->tableWidget->horizontalHeader()->setVisible(checked);
}


void MainWindow::on_checkBoxDisplayVertical_clicked(bool checked)
{
    ui->tableWidget->verticalHeader()->setVisible(checked);
}


void MainWindow::on_radioButtonSelectLine_clicked()
{
    ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
}


void MainWindow::on_radioButtonSelectCell_clicked()
{
    ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectItems);
}


void MainWindow::on_tableWidget_currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn)
{
    Q_UNUSED(previousRow);
    Q_UNUSED(previousColumn);
    QTableWidgetItem* item = ui->tableWidget->item(currentRow,currentColumn);
    if(item == nullptr) return;
    labCellIndex->setText(QString::asprintf("当前单元格坐标:%d,%d",currentRow,currentColumn));
    labCellType->setText(QString::asprintf("当前单元格类型:%d",item->type()));
    item = ui->tableWidget->item(currentRow,colName);
    labStudId->setText(QString::asprintf("学生ID:%d",item->data(Qt::UserRole).toUInt()));
}

效果展示