gpt4 book ai didi

qt - 更改多列过滤的 QSortFilterProxyModel 行为

转载 作者:行者123 更新时间:2023-12-01 23:30:15 31 4
gpt4 key购买 nike

我们有一个QSortFilterProxyModel安装在 QTableView和两个(或更多)QLineEdit用于过滤 View (基于这些 QLineEdit 的文本)

在我们看来,我们有一个槽,它告诉我们行编辑的字符串和我们想要的当前列。像这样的事情:

void onTextChange(int index, QString ntext) {
filter.setFilterKeyColumn(index);
filter.setFilterRegExp(QRegExp(ntext, Qt::CaseInsensitive));
}

在第一列中我们有名字,在第二列中我们有生日年份。

现在我们在第 2 列中输入年份(例如 1985 年)。到目前为止,过滤还可以,但是当我们切换到第一行编辑并输入名称(例如约翰)时,之前基于年份的过滤将重置。

我们如何更改自定义的此行为 QSortFilterProxyModel

(实际上,当我们更改过滤器键列时,过滤器模型必须过滤现有 View 而不是重置它)

更新...

基于@Mike的回答:如果您使用 QMap<int, QRegExp> 与未知列数交互会帮助你

最佳答案

基于@Hayt 的回答和评论。由于您希望在模型上有两个单独的过滤器,因此您可以有两个链接的QSortFilterProxyModel(一个根据名称进行过滤,另一个使用第一个过滤模型根据年份进行过滤作为源模型)。

这是一个完整的示例,说明如何为一个表设置两个单独的过滤器:

Example Screenshot

#include <QApplication>
#include <QtWidgets>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//set up GUI
QWidget w;
QVBoxLayout layout(&w);
QHBoxLayout hLayout;
QLineEdit lineEditName;
QLineEdit lineEditYear;
lineEditName.setPlaceholderText("name filter");
lineEditYear.setPlaceholderText("year filter");
lineEditYear.setValidator(new QRegExpValidator(QRegExp("[0-9]*")));
lineEditYear.setMaxLength(4);
hLayout.addWidget(&lineEditName);
hLayout.addWidget(&lineEditYear);

QTableView tableView;
layout.addLayout(&hLayout);
layout.addWidget(&tableView);

//set up models
QStandardItemModel sourceModel;
QSortFilterProxyModel yearFilterModel;
yearFilterModel.setSourceModel(&sourceModel);
QSortFilterProxyModel nameFilterModel;
//nameFilterModel uses yearFilterModel as source
nameFilterModel.setSourceModel(&yearFilterModel);
//tableView displayes the last model in the chain nameFilterModel
tableView.setModel(&nameFilterModel);
nameFilterModel.setFilterKeyColumn(0);
yearFilterModel.setFilterKeyColumn(1);
nameFilterModel.setFilterCaseSensitivity(Qt::CaseInsensitive);
yearFilterModel.setFilterCaseSensitivity(Qt::CaseInsensitive);

QObject::connect(&lineEditName, &QLineEdit::textChanged, &nameFilterModel,
static_cast<void (QSortFilterProxyModel::*)(const QString&)>
(&QSortFilterProxyModel::setFilterRegExp));
QObject::connect(&lineEditYear, &QLineEdit::textChanged, &yearFilterModel,
static_cast<void (QSortFilterProxyModel::*)(const QString&)>
(&QSortFilterProxyModel::setFilterRegExp));

//fill with dummy data
QVector<QString> names{"Danny", "Christine", "Lars",
"Roberto", "Maria"};
for(int i=0; i<100; i++){
QList<QStandardItem*> row;
row.append(new QStandardItem(names[i%names.size()]));
row.append(new QStandardItem(QString::number((i%9)+1980)));
sourceModel.appendRow(row);
}
w.show();
return a.exec();
}

关于qt - 更改多列过滤的 QSortFilterProxyModel 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39488901/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com