【问题标题】:How to get the row of a record in QSqlTableModel?如何获取 QSqlTableModel 中记录的行?
【发布时间】:2016-02-04 16:51:18
【问题描述】:

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

我有一个模型(QSqlTableModel),我想知道表“人”中记录的哪一行,电子邮件为“a@gmail.com”。 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.

【问题讨论】:

    标签: c++ qt sqlite


    【解决方案1】:

    来自docs

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

    while (query.next()) {
        QString name = query.value(0).toString();
        int salary = query.value(1).toInt();
        qDebug() << name << salary;
    }
    

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

    在您的情况下,由于您使用 SELECT * 返回一行的所有元素,因此这些字段将按照创建它们的顺序进行排序。

    【讨论】:

    • 嗨,谢谢你的回答,但为了更清楚,我想使用我事先知道的一些字段来检索存储在我的模型(这是一个 QSqlTableModel)中的一些记录的行号,像电子邮件。我不需要字段的值,我已经有了,我需要知道搜索到的数据在哪一行。
    • 我不确定您要在这里做什么或为什么,但我能想到的唯一方法是检索数据库的所有行,然后循环遍历它们直到找到该行有问题。你所要做的就是拥有某种计数器并在每次迭代中递增它。
    【解决方案2】:

    可以使用不同的方法:

    • 如下扫描和测试整个表格的数据:

      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;
      }
      
    • 通过 QSortFilterProxyModel 过滤您的数据字符串:

      int getRowWithEmail(QSqlTableModel& table, const QString & email)
      {
         int col = table.fieldIndex("email");
         QSortFilterProxyModel proxy;
         proxy.setSourceModel(table);
         proxy.setFilterKeyColumn(col);
         proxy.setFilterRegExp(QString("^%1$").arg(email));
         if(proxy.rowcount()>0)
             return proxyModel->mapToSource(proxyModel->index(0,0)).row();
         return -1;
      }
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-27
      • 1970-01-01
      • 2011-08-11
      • 1970-01-01
      相关资源
      最近更新 更多