首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将QSqlQueryModel数据转换为QVector

将QSqlQueryModel数据转换为QVector
EN

Stack Overflow用户
提问于 2013-08-08 14:30:54
回答 1查看 5.1K关注 0票数 0

如果我们使用以下QT功能从SQL数据库中获取数据

代码语言:javascript
复制
 QSqlQueryModel *model = new QSqlQueryModel;
 model->setQuery("SELECT name, salary FROM employee");

它在附带的材料中声明,我们可以使用以下命令之一访问各个元素

代码语言:javascript
复制
 int salary = model.record(4).value("salary").toInt();

代码语言:javascript
复制
 int salary = model.data(model.index(4, 2)).toInt();

并且我们可以将这些数据插入到QTableView中,

代码语言:javascript
复制
 QTableView *view = new QTableView;
 view->setModel(model);

然而,这些数据也可以是,我可以在任何地方看到如何提取整个数据列或列/行范围(或者QSqlQueryModel索引和角色的术语)。

最后,我想要做的是有效地将部分数据提取到QVectors中,例如数据的第3列。也有可能使用某种getDataFunc(QVector行、QVector列)进入矩阵库,如armadillo或Eigen。

我正在工作的数据可能是巨大的,因此高效是非常重要的,因此使用一组简单的for循环似乎是一个非常糟糕的主意。

任何帮助都很感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-08 16:13:19

我建议看一看QAbstractProxyModel。特别是考虑到你有一个庞大的数据集,所以在不同的地方复制它们对我来说不太好。

因此,在代码语言中,我想我会创建这样的东西:

代码语言:javascript
复制
class RowsInColumnProxyModel: public QAbstractProxyModel {

  ....

  void setTargetColumn( int column );
  void setRowsRange(int minRow, int maxRow);

  int rowCount(..);
  int columnCount(..);

  ... whatever else on your taste from QAbstractItemModel ... 

  virtual QModelIndex   mapFromSource(const QModelIndex & sourceIndex) const;
  virtual QModelIndex   mapToSource(const QModelIndex & proxyIndex) const;
}

您可能想看看Qt文档,因为有很多可用的示例。思想是在mapFrom和mapTo函数中提供一个逻辑,将列中的索引映射为完整数据集中的索引,以及行()和列()的适当值。rest是为您自动完成的,只要ProxyModel只是一个模型,您就可以在任何UI控件或任何其他喜欢的方式中使用它。我经常使用代理模型,这是非常方便的事情,一旦你习惯了它。

我试着做个例子,希望它能让你明白.Qt中的模型(无论其类型如何)是一组数据。根据类型的不同,它可以是一个有行和列的表(显然,一个列的模型是一个列表),也可以是一些更高级的东西,比如树,在那里您可以拥有更复杂的层次结构,但是现在让我们把它留在这里。

因此,QSqlQueryModel是一个带有行和列的平面表,其中行-是结果集中的许多记录,列是您在查询中获取的列数。

假设你有这样的东西

Col1 Col2 Col3

1 2 a 4 3 v 5 f

从数学的角度来看,你可以称它为矩阵。

QModelIndex -是一个类,它表示模型中的“位置”。为了使事情变得简单,您可以把它看作代表对{行,列}的东西。

因此,您可以使用方法从模型中获取数据。

代码语言:javascript
复制
 QVariant data( QModelIndex, DisplayRole)

此方法将返回位于QModelIndex描述的位置的单元格的内容。若要转换物理行和列,应使用方法

代码语言:javascript
复制
QModelIndex index(int row, int column, QModelIndex & parent = QModelIndex()); 

现在可以忽略最后一个参数(它仅用于树模型),因此要从平面表模型( QSqlRecordModel是)获取任何单元格,可以使用如下代码:

代码语言:javascript
复制
 QVariant value = model.data( model.index( row, column) );
 int      intValue = value.toInt();

 .. or in case you expect a string

 QString  strValue = value.toString()

 .. etc

所以,接近主题..。您的任务是提取一个向量,因此,假设您定义了一个类的任何矩阵column...so的一部分,如:

代码语言:javascript
复制
 class Vector: public QAbstractProxyModel {
     protected:

         // make them =0 in constructor

         int        m_column;
         int        m_minRow;
         int        m_maxRow;

      ...

         void  setTargetColumn( int column ) {
            // emitting signals important to let rest of the world now about changes
            emit beginResetModel();
            m_column = column;
            emit endResetModel();
         }

         void setRowsRange( int minRow, int maxRow ) {
            // emitting signals important to let rest of the world now about changes
            emit beginResetModel();
            m_minRow = minRow;
            m_maxRow = maxRow;
            emit endResetModel();             
         }

         virtual int columnCount(const QModelIndex & parent = QModelIndex()) {
            return 1;  // since it's vector
         }

         virtual int rowCount(const QModelIndex & parent = QModelIndex()) {
            return m_maxRow - m_minRow;
         }

         .. now most exciting part..

         virtual QModelIndex   mapFromSource(const QModelIndex & sourceIndex) const {
             int sourceRow = sourceIndex.row();
             int sourceColumn = sourceIndex.column();

             int targetColumn = 0; // only one in vector
             int targetRow = sourceRow - m_minRow;

             return modelIndex( targetRow, targetColumn );
         }

         virtual QModelIndex   mapToSource(const QModelIndex & proxyIndex) const {
             // same as above but a bit shorter

             return index( proxyIndex.row()+m_minRow, m_column );
         }       
 }

好的,我们有一门课,让我们用它

代码语言:javascript
复制
 QSqlRecordModel * sourceModel = ... (so, it's something)
 Vector * myVector = new Vector();
 myVector->setSourceModel( sourceModel );
 myVector->setTargetColumn(3);
 myVector->setRowsRange(5, 10);

 ...

 for (int i=0;i<myVector->rowCount();i++) {
     int vectorItem = myVector->data( myVector->index(i,0) ).toInt();
 }

希望它能解释得更多,我的回答是什么意思?

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18128722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档