如何获取QSqlTableModel中的记录行?

时间:2016-02-04 16:51:18

标签: c++ qt sqlite

我是使用qt的新手,我没有找到一种方法来检索我只知道字段(例如电子邮件)的某些元素的行。

我有一个模型(QSqlTableModel),我想通过电子邮件“a@gmail.com”知道表“person”中记录的哪一行。 QSqlQuery没有返回一行,我该如何实现呢?

QSqlQuery query;
query.exec(QString("SELECT * FROM person WHERE email = \"%1\";").arg("a@gmail.com"));
// the query.exec not return rows, but i need to know the row to edit some (not selectable) item, using QSqlTableModel::setRecord(int row, ...) for example.

2 个答案:

答案 0 :(得分:0)

来自docs

  

QSqlQuery一次提供对一个记录的结果集的访问。   在调用exec()之后,QSqlQuery的内部指针位于一个   在第一条记录之前的位置。我们必须调用QSqlQuery :: next()一次   前进到第一个记录,然后next()再次反复访问   其他记录,直到它返回false。这是一个典型的循环   按顺序迭代所有记录:

.leftfloat {
  float: none;
}

@media screen and (min-width: 420px) {
    .leftfloat {
      float: left;
    }
}

请注意QSqlQuery::value采用字段索引。 这些字段使用SELECT语句的文本从左到右编号。

在您的情况下,字段将按照创建它们的顺序排序,因为您使用while (query.next()) { QString name = query.value(0).toString(); int salary = query.value(1).toInt(); qDebug() << name << salary; } 返回行的所有元素。

答案 1 :(得分:0)

可以使用不同的方法:

  • 扫描并测试整个表上的数据,如下所示:

    None => panic!()
  • 通过QSortFilterProxyModel过滤数据字符串:

    int getRowWithEmail(QSqlTableModel& table, const QString & email)
    {
       int col = table.fieldIndex("email");
       for(int row=0; row<table; ++row)
       {
          const QString & str = table.data(table.index(row,col)).toString();
          if(str == email)
             return row;
       }
       return -1;
    }