qt之QTableview显示及单元格内容获取
qt中的显示模式是model/view方式。
一、数据显示
我常用两种方式利用qtableview显示数据。
如下述代码所述,条件编译对应的不同代码代表了两种不同的显示方式。第一种方式利用QSqlQueryModel,利用不同的sql语句,显示不同的表格和数据。
void MeasureDB::showDataTable(tableInfo &table,QString filter) { #if 0 qDebug()<<"cur filter string"<<filter; QSqlQueryModel *queryModel = new QSqlQueryModel(this); QSqlQuery query(currDatabase()); QString strSql=QString("select * from %1 where tm like \'%2%\' order by id DESC") .arg(table.name).arg(filter); if(query.exec(strSql)) { queryModel->setQuery(query); for(int i=0;i<table.fieldTitles.split(',').count();i++) { QString tmp=table.fieldTitles.split(',').at(i); queryModel->setHeaderData(i,Qt::Horizontal, QString(tmp.left(tmp.length()-1))); } while (queryModel->canFetchMore()) queryModel->fetchMore(); table.tableView->setModel(queryModel); } else qDebug()<<"query error,string sql"<<strSql; #else if(!filter.isEmpty()) filter=QString("tm like \'%1%\' ").arg(filter); model->setTable(table.name); qDebug()<<"filter "<<filter; model->setEditStrategy(QSqlTableModel::OnRowChange); if(!filter.isEmpty()) model->setFilter(filter); model->setSort(0,Qt::DescendingOrder); model->select(); table.view->setModel(model); table.view->resizeColumnsToContents();//表格列宽自适应调整
tableView->verticalHeader()->setHidden(true);//左侧行号隐藏
#endif
}
第二方式,定义QSqlTableModel指针,设置过滤条件、显示表格、排序方式也可实现表格的显示。我使用过程中两点注意事项:
1,前面使用QSqlTableModel时,先对其进行继承后再利用。作为小白一枚,当时觉得QSqlTableMode是抽象类,看来还需要认知下什么叫做抽象类。
2,以前显示表格的时候,每列专门设置列宽用来显示不同的列。实际只需要调用resizeColumnsToContents函数,就可以自适应调整显示的列宽。
model = new QSqlTableModel(m_tableView,currDatabase());
二、获取QTableView单元格内容
代码如下,代码中tbIP为QTableView对象,下述代码就可以获取当前QTableview对象单元格(当前行,packages列)的内容。另,如果修改单元格内容,则需要利用上述第二种表格显示方式。
QSqlTableModel *model=(QSqlTableModel *)ui->tbIP->model(); qDebug()<<"cur value"<<model->record(index.row()).value("packages").toString();