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) | 设置中线宽度 |
代码测试
#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()));
}
效果展示