о QSqlTableModel::setFilter

#qt

Вопрос:

о QSqlTableModel::setFilter существует очень мало примеров для QSqlTableModel::setFilter, и я пытаюсь использовать его многими способами, но все потерпели неудачу: //QString sqlstringqqq = QString(«выберите * из alarmInfoTable, где 1=1 порядок по rowid asc предел %1,20;»).arg(beginIDqqq); //QString sqlstringqqq = QString(«выберите * из alarmInfoTable, где 1=1 предел %1,20;»).arg(beginIDqqq);

 //QString sqlstringqqq = QString("SELECT * FROM alarmInfoTable LIMIT 3,10;");
//QString sqlstringqqq = QString("SELECT * FROM alarmInfoTable LIMIT 3,10");
QString sqlstringqqq = QString("select * from alarmInfoTable");


//ptableModel->setFilter("1=1 limit 2,10;");
//ptableModel->setFilter("limit 2,10;");

//ptableModel->setFilter("1=1 ORDER BY msgID ASC");
 

// ptableModel->setFilter(«1=1 предел 3,7;»);
ptableModel->setFilter(«msgID>>30;»);

 qDebug()<<" filter: "<< ptableModel->filter();


//ptableModel->setFilter(sqlstringqqq);
ptableModel->select();
 

этот метод подходит или нет?
есть ли какие-либо примеры, которые можно использовать для этого?

Ответ №1:

В setFilter() вы можете использовать только WHERE предложение и только один фильтр одновременно, поэтому поместите все свои фильтры в одну строку или используйте QSortFilterProxyModel подкласс.

Пример для setFilter() :

 void YourModel::acceptFilter(const QString amp;value, bool useFilterByDate, bool useDogFilter)
{
    QString whereStr = "col_name = %1";
    
    if(useFilterByDate)
        whereStr  = " AND DATE(date_col_name) BETWEEN '2021-01-01' AND '2021-06-06'";
    if(useDogFilter)
        whereStr  = " AND col_name2 = 'dog'";

    setFilter(whereStr.arg(value));
}
 

Если вы хотите использовать LIMIT , вы должны переопределить selectStatement() и добавить в строку запроса свой лимит следующим образом:

 QString selectStatement() const
{
    QString qStr = QSqlTableModel::selectStatement();
    qStr  = " LIMIT 100";
    return qStr;
}