QTableWidget 是一种 Item Widget 组 件,它以表格形式显示和管理数据,我们称为表格组件。示例运行时界面如图所示。 程序界面的右上角是一个表格组件。 表格的第一行称为水平表头(horizontal header), 用于设置每一列的标题。第一列称为垂直表头(vertical header), 也可以设置其标题,但一般使用默认的标题,也就是行号。水平表头和垂直表头一般是不可编辑的。除水平表头和垂直表头之外的表格区域是数据区,数据区呈规则的网格状,如同一个二维数组,一个网格称为单元格(cell)。每个单元格关联一个 QTableWidgetItem 对象,可以设置每个单元格的文字内容、字体、前景色、背景色、图标等, 单元格还可以有复选框或设置为其他 widget 组件。每个单元格还可以存储用户数据。
一. 窗口界面可视化设计和初始化
1.窗口界面可视化设计
示例的窗口基类是 QMainWindow。在 UI 可视化设计时,我们删除了主窗口上的菜单栏和工具栏,保留了状态栏。在上图所示的窗口上,右侧的一个 QTableWidget 组件和一个 QPlainTextEdit 组件组成垂直分割布局splitter。左侧的按钮等组件都放在一个分组框groupBox 里, 采用网格布局。然后使 groupBox 与 splitter 水平分割布局。这是典型的三区分割的布局。
将窗体上的表格组件命名为 tableInfo,通过属性编辑器就可以设置表格的行数和列数以及其他一些属性,这些属性一般都是用来控制表格显示效果的,比较直观。
在 UI 可视化设计时,双击窗体上的表格组件 tableInfo,会打开下图所示的编辑器。这个编辑器有 3 个页面, Columns 页面用于编辑水平表头,Rows 页面用于编辑垂直表头, Items 页面用于编辑表格的单元格。
表格组件数据区的每个单元格可以关联一个 QTableWidgetItem 对象, 表头的单元格也是 QTableWidgetItem 对象。可以设置每个 QTableWidgetItem 对象的文字、字体、背景色、图标等特性。
2.窗口类定义和初始化
下面是 MainWindow 类的定义代码,这个窗口类里没有自定义槽函数。
class MainWindow : public QMainWindow
{
Q_OBJECT
private:
//单元格的类型,在创建单元格时用于设置 type
enum CellType{ctName=1000,ctSex,ctBirth,ctNation,ctPartyM,ctScore};
//各字段在表格中的列号
enum FieldColNum{colName=0, colSex,colBirth,colNation,colScore,colPartyM};
QLabel *labCellIndex; //状态栏上用于显示单元格的行号、列号
QLabel *labCellType; //状态栏上用于显示单元格的 type
QLabel *labStudID; //状态栏上用于显示单元格的 data
void createItemsARow(int rowNo,QString name,QString sex,QDate birth,
QString nation,bool isPM,int score); //为某一行创建 items
public:
MainWindow(QWidget *parent = nullptr);
private:
Ui::MainWindow *ui;
};
在 MainWindow 类的构造函数中编写代码创建 3 个 QLabel 对象,并将其添加到状态栏上。代码如下:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 状态栏初始化
labCellIndex = new QLabel("当前单元格坐标:",this);
labCellIndex->setMinimumWidth(250);
labCellType=new QLabel("当前单元格类型:",this);
labCellType->setMinimumWidth(200);
labStudID=new QLabel("学生 ID:",this);
labStudID->setMinimumWidth(200);
ui->statusBar->addWidget(labCellIndex); //添加到状态栏
ui->statusBar->addWidget(labCellType);
ui->statusBar->addWidget(labStudID);
}
二. QTableWidget 类
1.表格的行和列
QTableWidget 是 QTableView 的便利类, QTableWidget 的属性 和接口函数主要是父类中定义的。 QTableWidget 新增了两个属性,rowCount 表示数据区行数,columnCount 表示数据区列数。 QTableWidget 还定义了如下的几个公有槽函数,用于插入或移除一行或一列。
void insertColumn(int column) //在列号为 column 的位置插入一个空列
void removeColumn(int column) //移除列号为 column 的一列
void insertRow(int row) //在行号为 row 的位置插入一个空行
void removeRow(int row) //移除行号为 row 的一行
2.单元格关联的 QTableWidgetItem 对象
QTableWidget 表格的一个单元格一般关联一个 QTableWidgetItem 对象,我们称为项或表格项。一个项不仅存储了单元格需要显示的文字,还有文字的字体、对齐方式、背景色等定义,以及图标、是否有复选框等设置内容。QTableWidget 根据每个单元格的项绘制表格。
要为表格的一个单元格设置项,一般是先创建一个 QTableWidgetItem 对象 item,设置其各种属性,然后用函数 setItem()将 item 设置为某个单元格的项,其函数原型定义如下:
void setItem(int row, int column, QTableWidgetItem *item)
其中,row 和 column 分别是单元格的行号和列号,item 是已创建的 QTableWidgetItem 对象指针。 要移除一个单元格关联的项,可以使用函数 takeItem()来实现,其函数原型定义如下:
QTableWidgetItem *takeItem(int row, int column)
函数 takeItem()会移除单元格关联的项,并返回这个项的对象指针,但并不删除这个对象。若要释放对象占用的内存,需要用 delete 删除对象。
QTableWidget 定义了两个公有槽,可以用来清除整个表格或数据区的全部单元格的项。
void clear() //清除表头和数据区的所有项
void clearContents() //清除数据区的所有项
3.当前单元格和当前项
QTableWidget 表格数据区有一个当前单元格,也就是获得输入焦点的单元格。可以返回当前单元格的行号和列号,也可以通过行号和列号设置当前单元格。相关函数定义如下:
int currentRow() //返回当前单元格的行号
int currentColumn() //返回当前单元格的列号
void setCurrentCell(int row, int column) //通过行号和列号设置当前单元格
当前单元格关联的 QTableWidgetItem 对象就是当前项,可以返回当前项的对象指针。也可以设置某个 QTableWidgetItem 对象为当前项,以改变当前单元格的位置。相关的两个函数定义如下:
QTableWidgetItem *currentItem() //返回当前单元格的项
void setCurrentItem(QTableWidgetItem *item) //设置当前项,改变当前单元格的位置
4.单元格的索引
为表格的每个单元格关联一个项之后,可以在表格内通过行号和列号获取每个单元格的项, 项也有自己的行号和列号。相关的 3 个函数定义如下:
QTableWidgetItem *item(int row, int column) //通过行号和列号返回项
int row(const QTableWidgetItem *item) //返回一个项的行号
int column(const QTableWidgetItem *item) //返回一个项的列号
5.水平表头
水平表头的每个单元格可以设置一个项,相关的函数定义如下。
void setHorizontalHeaderItem(int column, QTableWidgetItem *item) //为某列设置项
QTableWidgetItem *horizontalHeaderItem(int column) //返回 column 列的表头项
QTableWidgetItem *takeHorizontalHeaderItem(int column) //移除 column 列的表头项
通过为水平表头的每个单元格设置项就可以定义表头的具体格式,例如使用不同的背景色。
如果只是设置表头文字而不需要设置任何特殊的格式,可以使用一个简化的函数来实现,函数定义如下:
void setHorizontalHeaderLabels(const QStringList &labels)
这个函数使用一个字符串列表的每一行作为水平表头每一列的标题,使用默认的格式。
6.垂直表头
默认情况下,垂直表头会自动显示行号,不需要专门操作。垂直表头的每个单元格可以设置一个项或直接设置标题文字,相关函数定义如下:
void setVerticalHeaderItem(int row, QTableWidgetItem *item) //设置 row 行的表头项
QTableWidgetItem *verticalHeaderItem(int row) //返回 row 行的表头项
QTableWidgetItem *takeVerticalHeaderItem(int row) //移除 row 行的表头项
void setVerticalHeaderLabels(const QStringList &labels) //用一个字符串列表设置表头标题
7.QTableWidget 的信号
QTableWidget 定义了较多的信号,信号函数定义如下,信号被发射的条件见注释。
void cellActivated(int row, int column) //单元格被激活时
void cellChanged(int row, int column) //单元格的数据内容改变时
void cellClicked(int row, int column) //在单元格上点击鼠标时
void cellDoubleClicked(int row, int column) //在单元格上双击鼠标时
void cellEntered(int row, int column) //鼠标移动到一个单元格上时
void cellPressed(int row, int column) //在单元格上按下鼠标左键或右键时
void currentCellChanged(int currentRow, int currentColumn, int previousRow, int
previousColumn) //当前单元格发生切换时
void itemActivated(QTableWidgetItem *item)
void itemChanged(QTableWidgetItem *item)
void itemClicked(QTableWidgetItem *item)
void itemDoubleClicked(QTableWidgetItem *item)
void itemEntered(QTableWidgetItem *item)
void itemPressed(QTableWidgetItem *item)
void currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous)
void itemSelectionChanged() //选择的项发生变化时
这些信号主要分为两大类,一类以单元格的行号和列号作为参数,另一类以 QTableWidgetItem 对象作为参数。例如,当前单元格发生切换时,会同时发射 currentCellChanged()信号和 currentItemChanged() 信号。currentCellChanged()信号传递 4 个参数,即当前单元格的行号和列号以及之前单元格的行号和列号; currentItemChanged()信号传递两个参数, 即当前项和之前的项。用户编写处理程序时,根据处理需要选择其中一个信号进行处理即可。
itemSelectionChanged()信号在选择的项发生变化时被发射,如果表格允许多选单元格,当用户按住 Ctrl 键选择的单元格发生变化时,组件就会发射此信号。
三. QTableWidgetItem 类
QTableWidget 表格的每个单元格都需要关联一个 QTableWidgetItem 对象。QTableWidgetItem 类没有父类,它存储了单元格的文字及其格式定义,QTableWidget 就是根据每个单元格的项定义的各种属性绘制表格的。
1.创建 QTableWidgetItem 对象
QTableWidgetItem 有多种参数形式的构造函数,其中的 3 种构造函数定义如下:
QTableWidgetItem(const QIcon &icon, const QString &text, int type = Type)
QTableWidgetItem(const QString &text, int type = Type)
QTableWidgetItem(int type = Type)
不管哪个构造函数,都需要传递一个参数 type 表示项的类型,类型由用户定义和使用。项被创建后,其类型就不能再改变,通过 QTableWidgetItem::type()函数可以返回项的类型。
创建 QTableWidgetItem 对象后,通过 QTableWidget::setItem()函数可以将其设置为某个单元格的项。
2.项的设置
QTableWidgetItem 有一些接口函数用于设置项的文字、对齐方式、前景色、背景色等特性, 这些函数的定义如下,函数作用见注释。
void setText(const QString &text) //设置单元格显示的文字
void setTextAlignment(int alignment) //设置文字对齐方式
void setBackground(const QBrush &brush) //设置背景色
void setForeground(const QBrush &brush) //设置前景色,即文字的颜色
void setFont(const QFont &font) //设置字体
void setIcon(const QIcon &icon) //设置图标
void setCheckState(Qt::CheckState state) //设置复选状态
void setToolTip(const QString &toolTip) //设置 toolTip
void setStatusTip(const QString &statusTip) //设置 statusTip
如果项被设置为可复选的,在单元格里会出现一个复选框,函数 setCheckState()可设置项的复选状态。每个设置函数都有对应的读取函数,这里就不列出来了。
函数 setFlags()可设置项的标志,其函数原型定义如下:
void setFlags(Qt::ItemFlags flags)
参数 flags 是标志类型 Qt::ItemFlags,是枚举类型 Qt::ItemFlag 的枚举值的组合。Qt::ItemFlag 的各枚举值表示项的特性,包括项是否可选、是否可编辑、是否可复选等。
除了设置项可见的文字和显示格式,还可以用函数 setData()设置用户数据,用户数据是不显示在表格中的。设置和读取用户数据的函数定义如下:
void setData(int role, const QVariant &value)
QVariant data(int role)
参数 role 是用户数据角色, 可以使用常量 Qt::UserRole 定义第一个用户数据, 使用 1+Qt::UserRole 定义第二个用户数据。用户数据是 QVariant 类型,可以存储各种类型的数据。
3.与表格相关的接口函数
QTableWidgetItem 对象被设置为某个单元格的项之后, 它就有了行号和列号, 可以被选择, 相关的函数定义如下:
int row() //返回项所在单元格的行号
int column() //返回项所在单元格的列号
void setSelected(bool select) //设置项的选中状态
bool isSelected() //项是否被选中,也就是单元格是否被选中
QTableWidget *tableWidget() //返回项所在的 QTableWidget 对象指针
四. 示例中 QTableWidget 的操作
1.设置水平表头
界面上的“设置水平表头”按钮实现对水平表头的设置,其 clicked()信号的槽函数代码如下:
void MainWindow::on_btnSetHeader_clicked()
{
QStringList headerText;
headerText<<"姓名"<<"性别"<<"出生日期"<<"民族"<<"分数"<<"是否党员";
// ui->tableInfo->setHorizontalHeaderLabels(headerText); //只设置标题
ui->tableInfo->setColumnCount(headerText.size()); //设置表格列数
for (int i=0; i<ui->tableInfo->columnCount(); i++)
{
QTableWidgetItem *headerItem= new QTableWidgetItem(headerText.at(i)); //创建item
QFont font= headerItem->font(); //获取原有字体设置
font.setBold(true); //设置为粗体
font.setPointSize(11); //字体大小
headerItem->setForeground(QBrush(Qt::red)); //设置文字颜色
headerItem->setFont(font); //设置字体
ui->tableInfo->setHorizontalHeaderItem(i,headerItem); //设置表头单元格的 item
}
}
水平表头各列的文字标题由一个 QStringList 对象 headerText 初始化存储,如果只是设置表头各列的标题,使用下面一行语句即可:
ui->tableInfo->setHorizontalHeaderLabels(headerText);
如果需要进行更加具体的格式设置, 需要为表头的每个单元格创建一个 QTableWidgetItem 对象, 并进行相应设置。
2.初始化表格数据
界面上的“初始化表格数据”按钮根据表格的行数生成数据填充表格, 并为每个单元格创建项, 以及设置各种属性。下面是这个按钮的 clicked()信号的槽函数代码:
void MainWindow::on_btnIniData_clicked()
{
QDate birth(2001,4,6); //初始化日期
ui->tableInfo->clearContents(); //只清除工作区,不清除表头
for (int i=0; i<ui->tableInfo->rowCount(); i++)
{
QString strName= QString("学生%1").arg(i);
QString strSex= ((i % 2)==0)? "男":"女";
bool isParty= ((i % 2)==0)? false:true;
int score= QRandomGenerator::global()->bounded(60,100); //随机数范围为[60,100)
createItemsARow(i, strName, strSex, birth,"汉族",isParty,score); //为某一行创建items
birth=birth.addDays(20); //日期加 20 天
}
}
在 for 循环里为表格的每一行生成需要显示的数据,然后调用自定义函数 createItemsARow() 为表格一行的各个单元格创建项。函数 createItemsARow()的代码如下:
void MainWindow::createItemsARow(int rowNo,QString name,QString sex,QDate
birth,QString nation,bool isPM,int score)
{
uint studID=202105000; //学号基数
//姓名
QTableWidgetItem *item= new QTableWidgetItem(name, MainWindow::ctName);//type 为ctName
item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
studID += rowNo; //学号 =基数 + 行号
item->setData(Qt::UserRole,QVariant(studID)); //设置 studID 为用户数据
ui->tableInfo->setItem(rowNo,MainWindow::colName,item); //为单元格设置 item
//性别
QIcon icon;
if (sex == "男")
icon.addFile(":/images/icons/boy.ico");
else
icon.addFile(":/images/icons/girl.ico");
item= new QTableWidgetItem(sex,MainWindow::ctSex); //type 为 ctSex
item->setIcon(icon);
item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
Qt::ItemFlags flags= Qt::ItemIsSelectable |Qt::ItemIsEnabled; //“性别”单元格不允许编辑
item->setFlags(flags);
ui->tableInfo->setItem(rowNo,MainWindow::colSex,item);
//出生日期
QString str= birth.toString("yyyy-MM-dd"); //日期转换为字符串
item= new QTableWidgetItem(str,MainWindow::ctBirth); //type 为 ctBirth
item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
ui->tableInfo->setItem(rowNo,MainWindow::colBirth,item);
//民族
item= new QTableWidgetItem(nation,MainWindow::ctNation); //type 为 ctNation
item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
ui->tableInfo->setItem(rowNo,MainWindow::colNation,item);
//是否党员
item= new QTableWidgetItem("党员",MainWindow::ctPartyM); //type 为 ctPartyM
item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
//“党员”单元格不允许编辑,但可以更改复选状态
flags= Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled;
item->setFlags(flags);
if (isPM)
item->setCheckState(Qt::Checked); //设置复选框
else
item->setCheckState(Qt::Unchecked);
item->setBackground(QBrush(Qt::yellow)); //设置背景色
ui->tableInfo->setItem(rowNo,MainWindow::colPartyM,item);
//分数
str.setNum(score);
item= new QTableWidgetItem(str,MainWindow::ctScore); //type 为 ctScore
item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
ui->tableInfo->setItem(rowNo,MainWindow::colScore,item);
}
这个表格的每一行有 6 个单元格, 需要为每一个单元格创建一个 QTableWidgetItem 对象, 并进行相应的设置。创建 QTableWidgetItem 对象所使用的构造函数原型为:
QTableWidgetItem(const QString &text, int type = Type)
其中, 参数 text 作为单元格的显示文字, 参数 type 作为项的类型。设置项的类型时使用了自定义枚举类型 CellType 的枚举值,用于表示单元格显示的数据字段。
对于“姓名”单元格, 我们使用函数 setData()设置了用户数据, 存储的是学生 ID。用户数据是不显示在界面上的,但是与单元格相关联。
item->setData(Qt::UserRole, QVariant(studID)); //设置 studID 为用户数据
对于“性别”单元格,我们使用 setFlags()函数设置了项的特性,使其不能被编辑。
Qt::ItemFlags flags= Qt::ItemIsSelectable |Qt::ItemIsEnabled; //“性别”单元格不允许编辑
而对于“党员”单元格,我们使用函数 setFlags()设置其不能被编辑,但是可以被复选。可以被复选的单元格里会出现一个复选框,可以改变其复选状态。
flags= Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled;
设置好 item 的各种属性之后, 需要用 QTableWidget::setItem()函数将 item 设置为某个单元格的项, 例如:
ui->tableInfo->setItem(rowNo, MainWindow::colName, item);
其中, rowNo 是单元格的行号, MainWindow::colName 是自定义枚举类型 FieldColNum 的一个枚举值,用于表示“姓名”列的列号。
3.获取当前单元格的数据
表格的当前单元格发生切换时,表格会发射 currentCellChanged()信号和 currentItemChanged() 信号,两个信号都可以用,只是传递的参数不同。我们为 currentCellChanged()信号编写槽函数,用于获取当前单元格的数据, 以及当前行的学生的学号信息, 然后将其显示在状态栏上。代码如下:
void MainWindow::on_tableInfo_currentCellChanged(int currentRow, int currentColumn,
int previousRow, int previousColumn)
{
Q_UNUSED(previousRow);
Q_UNUSED(previousColumn);
QTableWidgetItem* item= ui->tableInfo->item(currentRow,currentColumn);//获取 item
if (item == nullptr)
return;
labCellIndex->setText(QString::asprintf("当前单元格坐标:%d 行,%d 列",
currentRow,currentColumn));
int cellType= item->type(); //获取单元格的类型
labCellType->setText(QString::asprintf("当前单元格类型:%d",cellType));
item= ui->tableInfo->item(currentRow,MainWindow::colName); //当前行第一列的 item
uint ID= item->data(Qt::UserRole).toUInt(); //读取用户数据
labStudID->setText(QString::asprintf("学生 ID:%d",ID)); //学生 ID
}
在 currentCellChanged()信号中, 传递的参数 currentRow 和 currentColumn分别表示当前单元格的行号和列号, 通过行号和列号就可以得到单元格的 QTableWidgetItem 对象 item。
在获取了 item 之后,通过 item->type() 可以获取单元格的类型,这个类型对应的就是创建 QTableWidgetItem 对象时传递的类型参数。再获取同一行的“姓名”单元格的项,用QTableWidgetItem::data()函数读取用户数据,也就是创建单元格时存储的学生 ID。
4.插入、添加、删除行
下面是界面上“插入行” “添加行” “删除当前行”按钮的槽函数代码。在新增空行之后,会调用函数 createItemsARow()为新创建的空行的各单元格创建项。
void MainWindow::on_btnInsertRow_clicked()
{//“插入行”按钮
int curRow= ui->tableInfo->currentRow(); //当前行的行号
ui->tableInfo->insertRow(curRow); //插入一行,但不会自动为单元格创建 item
createItemsARow(curRow, "新学生", "男",
QDate::fromString("2002-10-1","yyyy-M-d"),"苗族",true,80);
}
void MainWindow::on_btnAppendRow_clicked()
{//“添加行”按钮
int curRow= ui->tableInfo->rowCount(); //当前行的行号
ui->tableInfo->insertRow(curRow); //在表格末尾添加一行
createItemsARow(curRow, "新生", "女",
QDate::fromString("2002-6-5","yyyy-M-d"),"满族",false,76 );
}
void MainWindow::on_btnDelCurRow_clicked()
{//“删除当前行”按钮
int curRow= ui->tableInfo->currentRow(); //当前行的行号
ui->tableInfo->removeRow(curRow); //删除当前行及其 items
}
5.自动调整行高和列宽
以下这几个函数可以自动调整表格的行高和列宽,这几个函数是 QTableWidget 的父类 QTableView 中定义的函数,其函数原型定义如下:
void resizeColumnToContents(int column) //自动调整列号为 column 的列的宽度
void resizeColumnsToContents() //自动调整所有列的宽度,以适应其内容
void resizeRowToContents(int row) //自动调整行号为 row 的行的高度
void resizeRowsToContents() //自动调整所有行的高度,以适应其内容
6.其他属性控制
窗口左侧的面板上还有一些复选框和单选按钮用于设置表格的一些特性,程序中用到的一些函数是 QTableWidget 的父类 QTableView 或 QTableView 的父类 QAbstractItemView 中定义的函数。
(1)设置表格内容是否可编辑。editTriggers 属性表示整个表格是否可编辑,以及进入编辑状态的方式。窗口上的“表格可编辑”复选框的槽函数代码如下:
void MainWindow::on_chkBoxTabEditable_clicked(bool checked)
{
if (checked) //允许编辑,双击或获取焦点后点击可进入编辑状态
ui->tableInfo->setEditTriggers(QAbstractItemView::DoubleClicked
| QAbstractItemView::SelectedClicked);
else
ui->tableInfo->setEditTriggers(QAbstractItemView::NoEditTriggers); //不允许编辑
}
(2)是否显示水平表头和垂直表头。函数 horizontalHeader()返回水平表头对象,verticalHeader() 返回垂直表头对象。表头对象是 QHeaderView 类,通过 QHeaderView 类的接口函数可以设置表头的各种属性,例如设置是否显示表头。
void MainWindow::on_chkBoxHeaderH_clicked(bool checked)
{//是否显示水平表头
ui->tableInfo->horizontalHeader()->setVisible(checked);
}
void MainWindow::on_chkBoxHeaderV_clicked(bool checked)
{//是否显示垂直表头
ui->tableInfo->verticalHeader()->setVisible(checked);
}
(3)间隔行底色。函数 setAlternatingRowColors() 用于设置表格的行是否用交替底色显示,若设置为 true,则会使用一种默认颜色错行设置为行的底色。
void MainWindow::on_chkBoxRowColor_clicked(bool checked)
{ //行的底色交替采用不同颜色
ui->tableInfo->setAlternatingRowColors(checked);
}
(4)选择方式。函数 setSelectionBehavior()用于设置选择方式,有单元格选择、行选择等方式。
void MainWindow::on_rBtnSelectItem_clicked()
{//选择方式:单元格选择
ui->tableInfo->setSelectionBehavior(QAbstractItemView::SelectItems);
}
void MainWindow::on_rBtnSelectRow_clicked()
{//选择方式:行选择
ui->tableInfo->setSelectionBehavior(QAbstractItemView::SelectRows);
}
7.遍历表格读取数据
“读取表格内容到文本” 按钮可演示遍历表格所有单元格的方法。它将每个单元格的文字读出, 同一行的单元格的文字用空格分隔开, 组合成一行文字, 然后将这一行文字添加到文本编辑器里显示。
void MainWindow::on_btnReadToEdit_clicked()
{
QTableWidgetItem *item;
ui->textEdit->clear();
for (int i=0; i<ui->tableInfo->rowCount(); i++) //逐行处理
{
QString str= QString::asprintf("第 %d 行: ",i+1);
for (int j=0; j<ui->tableInfo->columnCount()-1; j++) //逐列处理,最后一列单独处理
{
item= ui->tableInfo->item(i,j); //获取单元格的 item
str= str+item->text()+" "; //字符串拼接
}
item= ui->tableInfo->item(i,colPartyM); //最后一列
if (item->checkState()==Qt::Checked) //根据 check 状态显示文字
str= str +"党员";
else
str= str +"群众";
ui->textEdit->appendPlainText(str); //添加到编辑框作为一行
}
}