将QSqlQueryModel数据转换为QVector
Convert QSqlQueryModel Data into QVector(s)
如果我们使用以下QT功能从SQL数据库获取数据
QSqlQueryModel *model = new QSqlQueryModel;
model->setQuery("SELECT name, salary FROM employee");
它在随附的材料中指出,我们可以使用以下任一命令访问单个元素
int salary = model.record(4).value("salary").toInt();
或
int salary = model.data(model.index(4, 2)).toInt();
我们可以使用将这些数据插入QTableView
QTableView *view = new QTableView;
view->setModel(model);
这些数据也可以是。然而,我可以在任何地方看到如何提取整列数据或列/行的范围(或者用QSqlQueryModel索引和角色的术语)。
最终,我想做的是有效地将部分数据提取到QVectors中,例如数据的第3列。或者可能使用某种getDataFunc(QVector行、QVector列)将其转换成矩阵库,例如armadillo或Eigen。
我正在处理的数据可能是巨大的,因此效率很重要,因此使用一组简单的for循环似乎是一个非常糟糕的主意。
非常感谢您的帮助。
我建议查看一下QAbstractProxyModel。特别是考虑到你有一个巨大的数据集,所以在不同的地方复制它们对我来说不太好
因此,在代码语言中,我想我会创建这样的东西:
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函数中,您提供了一个映射将列中的索引转换为完整数据集中的索引,以及行()和列()的正确值。。剩下的是自动为您完成的,只要ProxyModel只是一个模型,您就可以在任何UI控件或任何其他您喜欢的方式中使用它。我经常使用代理模型,一旦你习惯了,这是一件非常方便的事情
我会举一些例子,希望它能让你明白。。。Qt中的模型(无论其类型如何)是一组数据。根据类型的不同,它可以是一个包含行和列的表(显然,包含一列的模型就是一个列表),也可以是更高级的东西,比如树,在树中可以有更复杂的层次结构,但现在就让我们暂不讨论它。
因此,QSqlQueryModel是一个包含行和列的平面表,其中rows-是结果集中的记录数,columns是您使用查询提取的列数。。
假设你有类似的东西
Col1 Col2 Col3
12 a4 3伏5 f f
从数学的角度来看,你可以称之为矩阵。
QModelIndex-是一个表示模型中"位置"的类。为了使事情变得简单,你可以把它看作是表示对{行,列}的东西
因此您可以使用方法从模型中获取数据
QVariant data( QModelIndex, DisplayRole)
此方法将返回位于QModelIndex描述的位置的单元格的内容。要转换物理行和列,您应该使用方法
QModelIndex index(int row, int column, QModelIndex & parent = QModelIndex());
现在可以忽略最后一个参数(它只用于树模型),所以要从平面表模型(QSqlRecordModel就是这样)中获取任何单元格,可以使用以下代码
QVariant value = model.data( model.index( row, column) );
int intValue = value.toInt();
.. or in case you expect a string
QString strValue = value.toString()
.. etc
所以,接近主题。。。你的任务是提取一个向量,比如说任何矩阵列的一部分。。。所以你定义了一个类,比如:
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 );
}
}
好的,我们有一个班,让我们用
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();
}
希望它能更多地解释我的答案
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 将 2D 矢量转换为 2D QVector C++
- 将QSqlQueryModel数据转换为QVector
- 将 QVariant 转换为 QVector<int>