我尝试过的操作
1。 QSqlQueryModel类: 我可以创建一个 QSqlQueryModel 对象,并将查询设置为 检索整个表数据,但是,我 在此类中找不到任何功能来过滤此数据:
QSqlQueryModel *model = new QSqlQueryModel;
model->setQuery("SELECT * FROM employee");
2。 QSqlTableModel:该类用于在 qtableView 中查看表数据,我可以使用该类读取表数据,然后像这样过滤该数据(我还没有尝试过):
QSqlTableModel *model = new QSqlTableModel
model->setTable("employee");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select();
model->setFilter("colum5 > 10");
// I can use after that data() method to retrieve filtered data.
3。对于Loop ,我曾考虑过使用for循环直接添加过滤器,但是,我宁愿选择一种更好的方法,因为我相信QT会提供此类服务。
方法应如下所示:
/**
* @brief getData executes sql select query.
* @param query [out] QSqlQuery query object after executing the query.
* @param queryFilters [in] map of query filters (column-name, filter-
value).
* @param table [in] table name.
* @return
*/
bool getData(QSqlQuery &query, std::map<std::string,QVariant> &queryFilters,
std::string &table){
bool status = false;
std::string queryText = "SELECT * from " + table + " WHERE ";
// I should apply filters from queryFilters map here.
return status;
}
答案 0 :(得分:0)
您可以通过多种方式进行此操作。
std::map
中使用for循环。使用 for
循环遍历密钥对值。
bool getData(QSqlQuery &query, const std::map<std::string,QVariant> &queryFilters,
std::string &table)
{
// ...
std::string queryText = "SELECT * from " + table + " WHERE";
for (auto it = queryFilters.begin(); it != queryFilters.end(); )
{
queryText += " " + it->first + "='" + it->second.toString().toStdString() + "'";
it++;
// check the iterator isn't the last iterator
if (it != queryFilters.end())
queryText += " AND"; // separate your "filters" using an AND
}
// ...
}
QMap
中使用for循环。但是,这就是Qt,所以为什么不利用original documentation,QMap
和QStringList
QTL类型。
bool getData(QSqlQuery &query, const QMap<QString, QVariant> &queryFilters,
const QString &table)
{
// ...
QString queryText = "SELECT * from " + table + " WHERE ";
QStringList filters;
foreach (const QString &filterKey, queryFilters.keys())
filters << filterKey + "='" + queryFilters.value(filterKey).toString() + "'";
queryText += filters.join(" AND ");
// ...
}
请注意,foreach
是Qt定义的宏。参见QString
。
有关您可能需要了解的其他QTL类型,请参见the foreach keyword。
我无法从您的问题和评论中得知您是否实际上在后台有一个sql表模型/视图/小部件,或者您是否正在完全使用其他功能。
我曾考虑过使用循环,但是,我认为使用某些qt类(例如QSqlQueryModel
)有更好的方法
可以肯定的是,containers仅浏览文档,没有过滤功能。
但是 ... QSqlQueryModel
确实具有此功能。好的一面是,如果某个地方已经有QSqlQueryModel
,则可以将其升级为QSqlTableModel
,因为后者继承了前者。但是,我又没有足够的信息来做出判断,所以我只是在黑暗中带领您走来走去。
希望这个答案可以帮助您了解困境,并提醒您如何提出更好的问题以获得更准确的答案。