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()));
}
效果展示
