w001
w001

Reputation: 11

about QSqlTableModel::setFilter

about QSqlTableModel::setFilter there is very few examples for QSqlTableModel::setFilter, and I try many way to use it but all failed: //QString sqlstringqqq = QString("select * from alarmInfoTable where 1=1 order by rowid asc limit %1,20;").arg(beginIDqqq); //QString sqlstringqqq = QString("select * from alarmInfoTable where 1=1 limit %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 limit 3,7;"); ptableModel->setFilter("msgID>30;");

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


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

is this method OK or not? is there any examples can run for it?

Upvotes: 1

Views: 1110

Answers (1)

Shtol Krakov
Shtol Krakov

Reputation: 1280

In setFilter() you can use only WHERE clause and only one filter at a time, so put all your filters into one string or use QSortFilterProxyModel subclass.

Example for setFilter():

void YourModel::acceptFilter(const QString &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));
}

If you want to use LIMIT you must override selectStatement() and append to query string your limit like so:

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

Upvotes: 1

Related Questions