常见界⾯设计组件————QTableWidget的使⽤QTableWidget概述
QTableWidget是Qt中的表格组件类。在窗体上放置⼀个QTableWidget组件后,可以在Property Editor⾥对其属性进⾏编辑,双击这个组件,可以打开⼀个编辑器,对其Colum、Row和Item进⾏编辑。⼀个QTableWidget的基本结构如图所⽰:
表格的第⼀⾏通常称为表头,⽤于设置每⼀列的标题, 第⼀列称为列表头,可以设置其标题,但⼀般使⽤缺省的标题(⾏号)。⾏表头和列表头⼀般不可编辑
除了⾏表头和列表头之外为表格的内容区,内容区是规则的⽹格状,每个⽹格被称为单元格且每个单元格都有⾏号和列号
在QTableWidget表格中,每个表格都是⼀个QTableWidgetItem对象,可以设置⽂字内容、字体、前景⾊和背景⾊、图标,也可以设置编辑和显⽰标记。每个单元格还可以存储⼀个QVariant数据,⽤以设置⽤户⾃定义数据
实例效果如下:
该实例将演⽰以下功能的实现:
设置表格的⾏号和列号,设置表头的⽂字、格式
初始化表格数据,设置⼀批实例数据填充到表格中
插⼊⾏、添加⾏、删除当前⾏等操作
遍历表格所有单元格,读取内容到QPlainTextEdit⾥,表格的⼀⾏数据作为⼀⾏⽂本
表格上选择的当前单元格变化时,在装态栏显⽰储存的信息
界⾯的设计于初始化
实例的主窗体从QMainWindow继承⽽来,窗⼝中,左侧是⼀个GroupBox组件,所有的PushButton组件和CheckBox组件都在其中,并且采⽤栅格布局;右侧分别是⼀个QTableWidget组件和⼀个QPlainTextEdit组件,⼆者采⽤垂直布局,这是⼀个典型的三区分割的布局
在主窗体类中,MainWindow⾥⾃定义了⼀些变量和函数,⽤于后⾯的代码是实现,下⾯是在MainWindow的private部分的变量和函数:
private:
Ui::MainWindow *ui;
/
/⾃定义单元格Type的类型,在创建单元格的item时使⽤
enum CellType{ctName=1000, ctSex, ctBirth, ctNation, ctPartyM, ctScore};
//各字段在表格中的列号
enum FieldColNumP{colName=0, colSex, colBirth, colNation, colPartyM, colScore};
QLabel *labCellIndex;          //状态栏上⽤以显⽰单元格的⾏号、列号
QLabel *labCellType;          //状态栏上⽤以显⽰单元格的type
QLabel *labStudID;            //状态栏上⽤以显⽰学号
//创建item
void createItemARow(int rowNo, QString Name, QString Sex, QDate brith,
QString Nation, bool isPM, int socore);
枚举类型CellType是⽤来表⽰单元格类型的,在创建单元格时使⽤
枚举类型FieldColNum⽤枚举常量表⽰格字段在表格中的列号
QTableWidget操作
设置表头
界⾯上的"设置表头"按钮实现对表头的设置,其clicked()信号的槽函数代码如下:
void MainWindow::on_btn_SetHeader_clicked()
{
//设置表头
QTableWidgetItem *headerItem;
QStringList headerText;
headerText<<"姓名"<<"性别"<<"出⽣⽇期"<<"民族"<<"分数"<<"是否党员";
//ui->tableWidget->setHorizontalHeaderLabels(headerText);
ui->tableWidget->unt());
for (int i=0; i<ui->tableWidget->columnCount(); i++) {
headerItem = new QTableWidgetItem(headerText.at(i));
QFont font = headerItem->font();
font.setBold(true);    //设置字体加粗
font.setPointSize(12);  //设置字体字号
headerItem->setTextColor(Qt::red); //设置颜⾊
headerItem->setFont(font);
ui->tableWidget->setHorizontalHeaderItem(i,headerItem);
}
}
⾏表头各列的⽂字标题由⼀个QStrnigList对象headerText初始化储存,如果只是设置⾏表头各列的标题,只需使⽤:
ui->tableWidget->setHorizontalHeaderLabels(headerText);
如果需要进⾏更加具体的设置,需要为⾏表头的每个单元创建⼀个QTableWidgetItem类型的变量,并进⾏相关设置
在⼀个表格中,不管是表头还是⼯作区,每个单元格都是⼀个QTableWidgetItem对象。QTableWidgetItem对象储存了单元格的所有内容,包括字标题、格式设置,已经关联的数据。
上⾯的程序中的for循环遍历headerText的每⼀⾏,⽤每⼀⾏的⽂字创建⼀个QTableWidgetItem对象headerItem,然后设置headerItem 的字体⼤⼩,粗体,颜⾊,然后将headerItem赋给表头的某⼀列:
ui->tableWidget->setHorizontalHeaderItem(i,headerItem);
初始化列表数据
界⾯上的"初始化表格数据"按钮根据表格的⾏数,⽣成数据填充表格,并为每个单元格⽣成QTableWidgetItem对象,设置相应属性。下⾯是btn_IniTable的响应槽函数代码:
void MainWindow::on_btn_InitTable_clicked()
{
//初始化表格
QString strName,strSex;
bool isSingal = true;
QDate birth;
birth.setDate(1998,05,01);
ui->tableWidget->clearContents();        //清除⼯作区,但不清除表头
int Rows = ui->tableWidget->rowCount();  //数据区⾏数
for (int i=0; i<Rows; i++) {
strName = QString::asprintf("学⽣%d",i);
if(i % 2 == 0)                      //按⾏数的奇偶设置学⽣不同属性
strSex = "男";
else
strSex = "⼥";
createItemARow(i, strName, strSex, birth, "汉族",isSingal, 70);
birth = birth.addDays(20);          //出⽣⽇期加20天
isSingal = !isSingal;
}
}
其中,QTableWidget::clearContents()函数清除表格⼯作区的数据,但不会清除表头;QTableWidget::rowCount()函数返回表格的⾏数
rows函数的使用方法及实例
在for循环中为每⼀⾏⽣成需要显⽰的数据,然后调⽤⾃定义函数createItemsARow(),为表格⼀⾏的各个单元格⽣成QTableWidgetItem 对象,其详细代码如下:
void MainWindow::createItemARow(int rowNo, QString Name, QString Sex,
QDate brith, QString Nation, bool isPM, int score)
{
//为⼀⾏表格创建item
QTableWidgetItem *item;
QString str;
uint StudID = 20190000;                //学号基数
item = new QTableWidgetItem(Name,MainWindow::ctName);
StudID += rowNo;                        //学号=基数+⾏号
//姓名
item->setData(Qt::UserRole,QVariant(StudID));
ui->tableWidget->setItem(rowNo,MainWindow::colName,item);
QIcon icon;
if(Sex == "男")
icon.addFile("../images/男⽣.png");
else
icon.addFile("../images/⼥⽣.png");
item = new QTableWidgetItem(Sex,MainWindow::ctSex);
item->setIcon(icon);
item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
ui->tableWidget->setItem(rowNo,MainWindow::colSex,item);
/
/出⽣⽇期
str = String("yyyy-MM-dd");          //⽇期转换为字符串
item = new QTableWidgetItem(str,MainWindow::ctBirth);
item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
ui->tableWidget->setItem(rowNo,MainWindow::colBirth,item);
//民族
item = new QTableWidgetItem(Nation,MainWindow::ctNation);
item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
ui->tableWidget->setItem(rowNo,MainWindow::colNation,item);
//是否党员
item = new QTableWidgetItem("党员",MainWindow::ctPartyM);
item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
if(isPM)
item->setCheckState(Qt::Checked);
else
item->setCheckState(Qt::Unchecked);
item->setBackgroundColor(Qt::yellow);
ui->tableWidget->setItem(rowNo,MainWindow::colPartyM,item);
//分数
str.setNum(score);
item = new QTableWidgetItem(str,MainWindow::ctScore);
item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
ui->tableWidget->setItem(rowNo,MainWindow::colScore,item);
}
该表格的每⼀⾏有5列,为每⼀个单元格都创建⼀个QTableWidgetItem类型的变量item,并做相应的设置
创建QTableWidgeItem使⽤的构造函数的原型为:
QTableWidgetItem::QTableWidgetItem(const QString &text, int type = Type)
其中,第⼀个参数作为单元格的显⽰⽂字,第⼆个参数作为节点的类型;例如创建"姓名"单元格对象时语句是:item = new QTableWidgetItem(Name,MainWindow::ctName);
其中,MainWindow::ctName是定义枚举类型的⼀个常量值
"姓名"单元格还调⽤了setData()函数设置了⼀个⾃定义类型数据,储存的信息为学⽣ID
item->setData(Qt::UserRole,QVariant(StudID));
这个⾃定义数据是不显⽰在界⾯上的,但是与单元格相关联
QTableWidgetItem中有⼀些函数可以对单元格的属性进⾏设置,如下:
setTextAlignment(int alignment);        //设置⽂字对齐⽅式
setBackground(const QBrush &brush);    //设置单元格背景颜⾊
setForeground(const QBrush &brush);    //设置单元格前景⾊
setIcon(const QIcon &icon);            //设置单元格图标
setFont(const QFont &font);            //设置字体
setCheckState(Qt::CheckState state);    //设置单元格勾选状态
setFlages(Qt::ItemFlags flags);        //设置单元格的属性标记
设置完相关属性之后,⽤QTableWidget的setItem函数将item设置为单元格的项:例如:
ui->tablewidget->setItem(rowNo,MainWindow::colName,item);
其中,MainWindow::colName是定义的枚举类型FiledColNum的⼀个常量值
当进⾏初始化之后,表格⾥⾯并没有显⽰学号,学号是"姓名"单元格的关联数据
获取单元格数据
当⿏标在单元格上单击单元格时,被选中的单元格是当前单元格。通过QTableWidget的currentColumn()和currentRow()可以获得当前单元格的列编号和⾏编号
当前单元格发⽣切换时,会发射currentCellChanged()信号和currentItemChanged()信号,两个信号的区别在于传递的参数不同
对currentCellChanged()信号编写槽函数,⽤于获取当前单元格的数据,以及当前⾏的学⽣的学号信息
在currentCellChanged()信号中,传递的参数为为当前单元格的⾏号和列号,通过这两个编号就能得到单元格的QTableWidget对象item
获得item之后,通过type()函数得到单元格的类型参数,这个类型就是创建单元格的QTableWidgetItem对象时传递的类型参数
再获取同⼀⾏的"姓名"单元格的项,⽤data()函数提取⾃定义数据学⽣ID
插⼊、删除、添加⾏
QTableWidget处理⾏操作的函数如下:
insertRow(int row):在⾏号为row的⾏前⾯添加⼀⾏,如果row等于或⼤于总⾏数,则在表格最后添加⼀⾏;insertRow()只是添加⼀个空⾏,不会为单元格创建QWidgetItem对象,需要⼿动创建
removeRow(int row):删除⾏号为row的⾏
下⾯是界⾯上"插⼊⾏"、"添加⾏"、"删除当前⾏"的响应槽函数。在调⽤插⼊之后,会调⽤createItemARow()函数为新创建的空⾏的各单元构造QTableWidgetItem对象

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。