Как заставить QSortFilterProxyModel перестать показывать неполные совпадения в результатах поиска? - PullRequest
1 голос
/ 22 июня 2019

Я пишу проект приложения управления базой данных для приюта для животных, в котором я использую QSortFilterProxyModel, чтобы показать результаты поиска.Проблема в том, что при поиске прокси-модели отображаются даже неполные совпадения.Например, если у меня есть три животных с идентификаторами 35, 388 и 3, и я ищу животное с идентификатором 3, он показывает мне всех 3 из них, потому что все их идентификаторы содержат 3.

Вот часть моего кода:

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
    ui->setupUi(this);

    proxyModel1 = new QSortFilterProxyModel(this);
    proxyModel1->setSourceModel(&model);
    ...
    connect(idEdit, SIGNAL(textChanged(const QString&)), this, SLOT(searchChanged()));
}

void MainWindow::searchChanged() {

    proxyModel1->setFilterRegExp(QRegExp(idEdit->text(), Qt::CaseInsensitive));
    proxyModel1->setFilterKeyColumn(0);
}

Мне нужно, чтобы это не произошло.

1 Ответ

0 голосов
/ 22 июня 2019

Метод, который служит для фильтрации точной строки, не существует, поэтому его необходимо реализовать, переопределяя метод filterAcceptsRow():

class SortFilterProxyModel: public QSortFilterProxyModel
{
public:
    using QSortFilterProxyModel::QSortFilterProxyModel;
    QString fixedString() const{
        return m_fixedString;
    }

    void setFixedString(const QString &fixedString){
        if(m_fixedString == fixedString) return;
        m_fixedString = fixedString;
        invalidateFilter();
    }

protected:
    bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override{
        if(m_fixedString.isEmpty())
            return true;
        QModelIndex ix = sourceModel()->index(source_row, filterKeyColumn(), source_parent);
        return ix.data().toString() == m_fixedString;
    }
private:
    QString m_fixedString;
};
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
    ui->setupUi(this);

    proxyModel1 = new SortFilterProxyModel(this);
    proxyModel1->setSourceModel(&model);
    connect(idEdit, &QLineEdit::textChanged, this, &MainWindow::searchChanged);    
}

void MainWindow::searchChanged() {
    proxyModel1->setFixedString(idEdit->text());
    proxyModel1->setFilterKeyColumn(0);
}
...