• 7796阅读
  • 5回复

[提问]显示数据库中查询的记录,显示效率问题 [复制链接]

上一主题 下一主题
离线jiang_198586
 

只看楼主 倒序阅读 楼主  发表于: 2011-08-23

我用的是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;
}
离线zhaowanlan
只看该作者 1楼 发表于: 2011-08-23
楼主你都已经关注查询显示的效率问题了啊。我最近也在用QSqlQueryModel,就是你说的那两个句子做显示,貌似QSqlQueryModel的帮助文档里头说有个SELECT(),你去看看吧,不知道对你有没有帮助。
顺便我也请教你一下,请问你知道怎么将界面和数据库建立连接吗?就是我点击一个button就能调出些东西的那种
离线jiang_198586

只看该作者 2楼 发表于: 2011-08-24
回 1楼(zhaowanlan) 的帖子
下面是我连接mysql数据库的连接代码,希望对你有帮助

void login::link(){
    GlobalVariables::name=ui->nameEdit->text().trimmed();
    GlobalVariables::password=ui->psdEdit->text().trimmed();
    /*QSqlDatabase db1,db2;
    db1=QSqlDatabase::addDatabase("QMYSQL","first");
    db2=QSqlDatabase::addDatabase("QMYSQL","second");
    //addDatabase第二参数在仅打开一个连接时用默认值,在二个以上连接中要指定连接名用来标识。
    //根据连接名来获得不同的数据库
    QSqlDatabase db =QSqlDatabase::database("first");//获得db1.*/
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName(GlobalVariables::ip);
    db.setPort(GlobalVariables::port.toInt());
    db.setDatabaseName(GlobalVariables::database);
    db.setUserName(GlobalVariables::name);
    db.setPassword(GlobalVariables::password);
    GlobalVariables::isconnection=db.open();
    if(GlobalVariables::isconnection){
        db.exec("SET NAMES  'utf8'");//设置与mysql相同字符集,让表中能显示中文,不出现乱码
        this->close();

        ownmain->show_imagelist();

   }
    else // 打开数据库失败
    {
        QString message="cannot open database.Reason:";
        message.append(db.lastError().databaseText());
        QMessageBox::critical(NULL,"open database",message,QMessageBox::Yes,QMessageBox::Yes);

    }
}
离线zhaowanlan
只看该作者 3楼 发表于: 2011-08-25

嗯,我也连接了数据库的,但是就是不知道怎么把这个数据库跟我用QML做的用户界面做连接。
不过看楼主的程序把中文显示乱码的问题也解决了?这也是我头痛的另一个问题。你针对显示中文写了哪些句子呢?要加哪些库啊?那表中的中文部分是怎么写的?
我模仿别人的示例写了一句,但是运行不对,不知道是我前面加库和声明那些没做好还是这句写错了,
能不能麻烦楼主帮忙看看,谢谢啦。
  1. query.exec(QString("insert into QiXu values('%1', '%2', '%3')".arg(QString("张三")).arg(QString("李四")).arg(QString("玄五")));
离线jay8830095
只看该作者 4楼 发表于: 2011-08-25
QT有这方面的类QSqlable,就是把你的数据库里面的东西连接到界面上,或者你自己设计界面,使用数据库内容进行赋值就好了
在不断的变化
离线jiang_198586

只看该作者 5楼 发表于: 2011-08-30
回 3楼(zhaowanlan) 的帖子
就是这个语句,你试一下看看吧!
db.exec("SET NAMES  'utf8'");//设置与mysql相同字符集,让表中能显示中文,不出现乱码
快速回复
限100 字节
 
上一个 下一个