1、QStandardItemModel负责保存数据,每个数据项被表示为类QStandardItem的对象。
2、类QStandardItemModel将类QStandardItem表示的数据项组织起来,形成列表、表格甚至更负责的数据结构。本例子中将数据集表示为一个表格,所以用QTableView显示该数据。具体代码如下:
void widget::CreateView()
{
mainLayout = new QVBoxLayout; //垂直布局
mainLayout->setSpacing(10); // 设置空间间距
mainLayout->setMargin(10); // 设置边缘间距
testBtn = new QPushButton("Test");
// 添加QTableView代码
tableView = new QTableView;
standItemModel = new QStandardItemModel();
//添加表头
standItemModel->setColumnCount(3);
// 设置表头
standItemModel->setHeaderData(0, Qt::Horizontal, tr("序号"));
standItemModel->setHeaderData(1, Qt::Horizontal, tr("名称"));
standItemModel->setHeaderData(2, Qt::Horizontal, tr("地址"));
//向表格添加100行内容
for (int i = 0; i < 100; i++)
{
QStandardItem *standItem1 = new QStandardItem(tr("%1").arg(i+1));
QStandardItem *standItem2 = new QStandardItem(tr("第%1行").arg(i+1));
QStandardItem *standItem3 = new QStandardItem(tr("学园路第%1号").arg(i+1));
// 表格第i行第0列添加内容
standItemModel->setItem(i, 0, standItem1);
// 设置字符颜色
standItemModel->item(i, 0)->setForeground(QBrush(QColor(255, 0, 0)));
// 设置表格内容居中
standItemModel->item(i, 0)->setTextAlignment(Qt::AlignCenter);
// 表格第i行第1列添加一条内容
standItemModel->setItem(i, 1, standItem2);
standItemModel->setItem(i, 2, standItem3);
}
// 挂载表格模型
tableView->setModel(standItemModel);
// 设置表格属性
tableView->horizontalHeader()->setDefaultAlignment(Qt::AlignCenter);
// 设定表头列宽不可变
tableView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
tableView->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Fixed);
// 设定第2列表头可拉伸
tableView->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch);
//设定表格第0列宽度
tableView->setColumnWidth(0, 100);
tableView->setColumnWidth(1, 200);
tableView->verticalHeader()->hide();
//设置选中时整行选中
tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
// 设置表格属性只读
tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
//删除从第0行开始的连续10行
//standItemModel->removeRows(0, 10);
mainLayout->addWidget(testBtn);
mainLayout->addWidget(tableView); //添加控件
this->setLayout(mainLayout); //显示垂直布局
}
效果如下:
接着,将TableView中的数据保存为本地的Excel文件
QAxObject *excel;
QAxObject *workBooks;
QAxObject *workBook;
QAxObject *workSheets;
QAxObject *workSheet;
QAxObject *range;
QAxObject *cell;
QAxObject *col;
QString path = "F:/QTCode/learning/SaveExcelFile/widget/widget/widget/";
QString fileName = path.append("Excel.xlsx");
excel = new QAxObject("Excel.Application");
if (!excel)
{
qDebug() << "create excel file failed";
}
else
{
qDebug() << "create excel file successed";
}
excel->dynamicCall("SetVisible (bool Visible)", true);
excel->dynamicCall("SetUserControl(bool UserControl)", true);
workBooks = excel->querySubObject("WorkBooks");
workBooks->dynamicCall("Add");
workBook = excel->querySubObject("ActiveWorkBook");
workSheets = workBook->querySubObject("Sheets");
workSheet = workSheets->querySubObject("Item(int)", 1);
workSheet->setProperty("Name", "数据");
int colCount = tableView->model()->columnCount();
int rowCount = tableView->model()->rowCount();
//写入数据到excel表格
for (int i = 0; i < rowCount; i++)
{
for (int j = 0; j < colCount; j++)
{
// 获取tableView中的索引号
QModelIndex index = tableView->model()->index(i, j);
// 获取索引号对应的数据
QString strData = tableView->model()->data(index).toString();
// 获取excel表格中的单元格索引,以(1, 1)为起点
cell = workSheet->querySubObject("Cells(int, int)", i+2, j+1);
// 写入数据到excel中的单元格
cell->dynamicCall("SetValue(const QString&)", strData);
}
}
// 列标题
for (int i = 0; i < colCount; i++)
{
// 获取单元格 A1, B1, C1
QString columnName;
columnName.append(QChar(i + 'A'));
columnName.append(QString::number(1));
cell = workSheet->querySubObject("Range(const QString)", columnName);
// 单元格属性设置
cell->setProperty("ColumnWidth", 500);
cell->setProperty("RowHeight", 30);
cell->querySubObject("Font")->setProperty("Bold", true);
cell->querySubObject("Interior")->setProperty("Color", QColor(150, 150, 150));
cell->setProperty("HorizontalAlignment", -4108);
// 获取列标题的单元格索引
col = workSheet->querySubObject("Cells(int, int)", 1, i + 1);
// 获取tableView中的列标题数据
columnName = tableView->model()->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString();
// 写入到excel的单元格中
col->dynamicCall("SetValue(const QString&)", columnName);
}
// 对单元格画边框
QString drawCellLine;
drawCellLine.append("A1:");
drawCellLine.append(colCount-1 + 'A');
drawCellLine.append(QString::number(tableView->model()->rowCount()));
range = workSheet->querySubObject("Range(const QString&)", drawCellLine);
range->querySubObject("Borders")->setProperty("LineStyle", QString::number(1));
range->querySubObject("Borders")->setProperty("Color", QColor(0, 0, 0));
// 调整数据行高
QString rowsName;
rowsName.append("1:");
rowsName.append(QString::number(tableView->model()->rowCount()));
range = workSheet->querySubObject("Range(const QString&)", rowsName);
range->setProperty("RowHeight", 20);
workBook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(fileName));
workBook->dynamicCall("Close()");
excel->dynamicCall("Quit()");
delete excel;
excel = NULL;
效果如下: