Что я пробовал:
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. Для цикла Я думал об использовании цикла 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;
}
Речь идет не об использовании карты или другого класса stl. Я спрашиваю о том, как динамически добавлять фильтры в оператор запроса.
Вы столкнетесь с большим количеством преобразований между типами STL / QTL. Так что можно начать использовать QString и QMap / QHash. Вы пробовали использовать цикл в этом отношении? :-)
Яп, я упустил этот момент. Благодарность!
Обычно при количестве переменных Переменная можно использовать циклы. Кроме того, просто наблюдая за вашей строкой, "SELECT * from" + table + "WHERE " будьте осторожны, помещайте пробелы до / после table, если вы не можете гарантировать наличие пробелов. «SELECT * frommyTableWHERE ...» не будет выполняться.
Я думал об использовании цикла для этого дела, но я подумал, что есть лучший способ использовать некоторые классы qt, например: QSqlQueryModel
Спасибо за совет, я думаю, что буду использовать цикл for непосредственно внутри запроса в качестве последнего решения !! :).
Привет еще раз. Если вы думали, что QSqlQueryModel мог бы быть лучшим решением, включите это в свой вопрос, поскольку он рассказывает нам о вашем мыслительном процессе: что сработало, а что не сработало.





Есть несколько способов сделать это.
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
}
// ...
}
QMap.Но черт возьми, это Qt, так почему бы не воспользоваться типами QTL QMap, QStringList и QString.
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, о которых вы, возможно, захотите знать, см. контейнеры.
Я не могу сказать из вашего вопроса и комментариев, действительно ли у вас есть модель / представление / виджет sql-таблицы в фоновом режиме или вы используете что-то совсем другое.
I thought about using loop for this matter.But, I thought that there is a better way using some qt classes like : QSqlQueryModel
Конечно, просто просматривая документацию, QSqlQueryModel не имеет функции фильтрации.
Но ... QSqlTableModelделает есть эта функция. Плюс в том, что если у вас уже есть QSqlQueryModel, вы можете обновить его до QSqlTableModel, поскольку последний наследует первый. Но опять же, у меня недостаточно информации, чтобы судить, поэтому я просто веду вас здесь в темноте.
Надеюсь, этот ответ проливает свет на ваше затруднительное положение вместе с напоминанием о том, как вы могли бы задать лучший вопрос, чтобы получить более точные ответы.
Спасибо, подумал об использовании QsqlTableModel. Но я думаю, что он должен получить все данные таблицы, прежде чем я смогу выполнить какой-либо процесс. И я обновлю свой вопрос и добавлю больше деталей.
Я думаю, что использование цикла foreach - лучшее решение на данный момент. Я пометил этот ответ как принятый. Ховервере, я буду обновлять свой вопрос всякий раз, когда найду другой подход.
Рад, что вы нашли это несколько полезным. Циклы for должны быть самыми простыми. :-) Вы, кажется, обеспокоены тем, что петли for не справятся с этим. ? Много фильтров?
Я думаю, что фильтров не так уж и много!. Пока я буду использовать цикл foreach, а также классы QTL вместо STL :).
Почему бы не использовать [
QMap] (doc.qt.io/qt-5/qmap.html)?