Есть несколько способов сделать это.
Использование цикла for с std::map
.
Используйте цикл 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
}
// ...
}
Использование цикла for с QMap
.
Но, черт возьми, это Qt, так почему бы не воспользоваться преимуществами типов QMap
, QStringList
и QString
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 макросом. См. ключевое слово foreach .
Информацию о других типах QTL, о которых вы можете знать, см. Containers .
QSqlQueryModel ???
Я не могу сказать по вашему вопросу и комментариям, действительно ли у вас есть модель / представление / виджет таблицы SQL в фоновом режиме или вы используете что-то еще целиком.
Я думал об использовании цикла для этого вопроса. Но я подумал, что есть лучший способ использовать некоторые классы qt, такие как: QSqlQueryModel
Конечно, просто просматривая документацию, QSqlQueryModel
не имеет функции фильтра.
Но ... QSqlTableModel
имеет эту функцию. Плюс в том, что если у вас уже есть QSqlQueryModel
где-то, вы можете повысить его до QSqlTableModel
, так как последний наследует первый. Но опять же, у меня недостаточно информации, чтобы выносить суждения, поэтому я просто веду вас сюда в темноте.
Надеюсь, этот ответ проливает некоторый свет на ваше затруднительное положение вместе с напоминанием о том, как вы могли бы задать лучший вопрос, чтобы получить более точные ответы.