我用的是QTableView和QStandardItemModel相结合来显示我在数据库中查询到的记录,有4000条左右时显示数据的速度就很慢。不知用哪个
model和QTableView结合显示数据能快点??
我尝试用QSqlQueryModel,但是我获取的字段值需要分解才添加到QTableView中,而QSqlQueryModel是直接将select后的记录直接显示的。如:
model->setQuery("select id,dsc from TBH_EVENT");
model->setHeaderData(0,Qt::Horizontal,tr("id"));
我的部分代码如下:
void Global_all::getTab(MyTableWidget *tab,int currentIndex){
currentWidget=tab;
QSqlQuery query;
sql=this->setSql(currentIndex,GlobalVariables::check_hidden[currentIndex]); //设置sql语句
qWarning(sql.toLatin1().data());
QModelIndex top ;
currentWidget->model->removeRows(0, currentWidget->model->rowCount(top), top);//清除原有的model数据
if(query.exec(sql)){
while(query.next()){
switch (currentIndex) {
case 0:
break;
case 1:
case 2:
case 5:
case 6:
vector=this->formatRes(&query); //对获取的记录做分解处理,下面有该函数的代码
break;
case 3:
case 4:
vector=this->format_file(&query);
break;
default:
break;
}
currentWidget->model->appendRow(vector); //QStandardItemModel模式添加行记录
}
}
else // 如果查询失败
{
//QSqlError error = query.lastError();
QMessageBox::information(NULL,"提示","数据库查询失败",QMessageBox::Yes,QMessageBox::Yes);
}
}
QList<QStandardItem *> Global_all::formatRes(QSqlQuery *query){
QList<QString> FltLoop;
QList<QStandardItem *> str;
FltLoop<<"未定义"<<"A相接地"<<"B相接地"<<"C相接地"<<"AB相"<<"BC相"<<"CA相"<<"ABC相";
QString stval="",mgstr="",phs="",time="";
unsigned long mq[13]={0};
QString id=query->value(0).toString();
QString dsp_name=query->value(1).toString();
if(dsp_name.isEmpty())
dsp_name="未找到";
QString ref=query->value(2).toString();
QString value_string=query->value(3).toString();
QString type=query->value(4).toString();
QString description=query->value(5).toString();
QString is_check=query->value(6).toString();
if(is_check=="0") is_check="否";
else is_check="是";
QStringList value=value_string.split(QRegExp(";|="));
for(int i=0;i<value.size()-1;i++){
if(value=="mag.f" && !value[i+1].isEmpty()){ //故障测距
mgstr=value[i+1];
description=description.append("="+mgstr);
}
if(value=="q" && value[i+1].isEmpty()){ //品质
for(int j=0;j<13;j++)
mq=0;
}
else if(value=="q" && !value[i+1].isEmpty()){
for(int j=0;j<13;j++){
mq[j]=((QString)value[i+1].at(j)).toLong();
}
}
if(value=="stVal"){
stval=value[i+1];
}
if(value=="general" && !value[i+1].isEmpty()){ //有出口
if(value[i+1].toLong()>0)
description=description.append(" !");
else if(value[i+1]=="0")
description=description.append(" 返回");
}
if(value=="phsA" && !value[i+1].isEmpty()){
if(value[i+1]=="1") phs=phs.append("A");
}
if(value=="phsB" && !value[i+1].isEmpty()){
if(value[i+1]=="1") phs=phs.append("B");
}
if(value=="phsC" && !value[i+1].isEmpty()){
if(value[i+1]=="1") phs=phs.append("C");
}
if(value==("t")){
QString sub_value=value[i+1];
QStringList time_value=sub_value.split("T");
time=time_value[0];
time=time.append(" ");
time=time.append(time_value[1]);
QStringList t=time.split(":");
QString tt = QString::number(t[2].toDouble(), 'f', 3);//double型得到小数点后3位,且四舍五入
if(tt.length()<6){
QString pre="0";
pre=pre.append(tt);
tt=pre;
}
time=t[0].append(":");
time=time.append(t[1]);
time=time.append(":");
time=time.append(tt);//转化为字符串输出
}
}
if(ref.indexOf("FltLoop")>0) //有故障相别
phs=FltLoop[stval.toLong()];
else if(ref.indexOf("FltNum")>0) //有故障序号
description=description.append("="+stval);
else {
if(stval.isEmpty())
description=description.append(" ");
else if(stval=="0")
description=description.append(" 返回");
else
description=description.append(" !");
}
if(description.indexOf("<检修>")<0){
if(mq[11]==1) description=description.append(" <检修>");
}
if(phs.trimmed().length()<3 && phs.trimmed().length()>0)
phs=phs.append("相");
else if(phs.trimmed()=="ABC" )phs=phs.append("三相");
str.append(new QStandardItem(id));
str.append(new QStandardItem(dsp_name));
str.append(new QStandardItem(time));
str.append(new QStandardItem(description));
str.append(new QStandardItem(phs));
str.append(new QStandardItem(is_check));
return str;
}