如何使 QSortFilterProxyModel 停止在搜索结果中显示不完整的匹配项?
How to make QSortFilterProxyModel stop showing incomplete matches in search results?
我正在为一个动物收容所编写一个数据库管理应用程序项目,我在其中使用 QSortFilterProxyModel
来显示搜索结果。问题是代理模型搜索甚至显示不完全匹配。例如,如果我有 3 只 ID 分别为 35、388 和 3 的动物,并且我搜索 ID 为 3 的动物,它会显示所有 3 只动物,因为它们的 ID 都包含 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);
}
我需要阻止这种情况发生。
用于过滤精确字符串的方法不存在,因此必须实现它覆盖 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);
}
您可以通过使您的文本成为完全匹配的正则表达式(以 ^ 开头并以 $ 结尾)来获得您想要的内容。
proxyModel1->setFilterRegExp(QRegExp('^' + idEdit->text() +'$', Qt::CaseInsensitive));
我正在为一个动物收容所编写一个数据库管理应用程序项目,我在其中使用 QSortFilterProxyModel
来显示搜索结果。问题是代理模型搜索甚至显示不完全匹配。例如,如果我有 3 只 ID 分别为 35、388 和 3 的动物,并且我搜索 ID 为 3 的动物,它会显示所有 3 只动物,因为它们的 ID 都包含 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);
}
我需要阻止这种情况发生。
用于过滤精确字符串的方法不存在,因此必须实现它覆盖 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);
}
您可以通过使您的文本成为完全匹配的正则表达式(以 ^ 开头并以 $ 结尾)来获得您想要的内容。
proxyModel1->setFilterRegExp(QRegExp('^' + idEdit->text() +'$', Qt::CaseInsensitive));