13.7.1 QListWidget(3)
每个国家的GDP信息存放在结构体GDP_FACTS中,成员Country指向一个国家的名称,GDP表示GDP总值,Population表示总人口。我们无须在这个结构体中定义每个国家的人均GDP,因为这个数据可以从已有的成员计算出来。GDP数据的表示如代码段13-32所示。
代码段13 32,GDP数据的表示,取自z:\examples\mvc\QTableWidget_demo\main.cpp
- typedef struct {
- char * country;
- double GDP, population;
- }GDP_FACTS;
- GDP_FACTS GDP_facts[] = {
- {"United States", 14.6, 2.7 },
- {"PRC China", 6.1, 13.0 },
- {"Japan", 5.4, 1.3 },
- {"Germany", 3.3, 0.8 },
- {"United Kingdom", 2.3, 0.6 }
- };
使用QTableWidget显示部分国家GDP数据的过程如代码段13 33所示。行①创建一个QTableWidget对象,行②调用其成员函数setHorizontalHeaderLabels()设置每列的标头。行③创建一个QTableWidgetItem对象表示表格中的一个数据项。该行下面的几行代码设置该数据项的文字对齐方式以及字体。行④~⑤设置某一行4个列的数据项,将角色DisplayRole对应的数据子项设置为该列对应的值。其中成员函数setData()的第二个函数参数是QVariant类型,行④构造的QVariant对象存放一个QString值,其他几行构造的QVariant对象存放double类型的值。当用户单击视图对象某列的标头要求排序时,QTableWidget会依据该列数据项中角色DisplayRole对应数据子项的类型进行排序。创建完毕这些数据项后,行⑥调用QTableWidget的成员函数setItem()将它们添加到QTableWidget的内部模型中。
代码段13 33,类QTableWidget的使用,取自z:\examples\mvc\QTableWidget_demo\main.cpp
- int main(int argc, char *argv[])
- {
- ……
- const int rows=5, columns=4;
- QTableWidget widget(rows, columns); ①
- QStringList list;
- list << "Country" << "Grand GDP" << "Population" << "GDP per person";
- widget.setHorizontalHeaderLabels(list); ②
-
- for (int row=0; row<rows; row++) {
- QTableWidgetItem * items[columns];
- for (int j=0; j<columns; j++ ) {
- items[j] = new QTableWidgetItem(); ③
- items[j]->setTextAlignment( Qt::AlignHCenter);
- QFont font; font.setPointSize(16);
- items[j]->setFont( font );
- }
- GDP_FACTS * p = & GDP_facts[row];
- items[0]->setData(Qt::DisplayRole, p->country ); ④
- items[1]->setData(Qt::DisplayRole, p->GDP );
- items[2]->setData(Qt::DisplayRole, p->population );
- items[3]->setData(Qt::DisplayRole, p->GDP / p->population );⑤
- for (int j=0; j<columns; j++ )
- widget.setItem(row, j, items[j] ); ⑥
- }
- widget.setSortingEnabled(true );
- ……
- }