以下是一个对QtableView过滤后的数据进行编辑的示例代码。
假设我们有一个基于QStandardItemModel的QTableView,数据来源于一个CSV文件,包含学生姓名、性别、成绩等信息。我们想要通过QLineEdit来实现按姓名过滤学生,并能够编辑过滤后的数据。
首先,我们在MainWindow类中定义以下内容:
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void onFilterChanged(const QString &text); // QLineEdit文本改变时触发的槽函数
void onTableDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight); // 数据修改时触发的槽函数
private:
Ui::MainWindow *ui;
QStandardItemModel *m_model; // 数据模型
QSortFilterProxyModel *m_proxyModel; // 过滤代理模型
};
然后,在MainWindow的构造函数中初始化模型、视图和过滤代理模型:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 初始化模型和视图
m_model = new QStandardItemModel(this);
ui->tableView->setModel(m_model);
// 初始化过滤代理模型
m_proxyModel = new QSortFilterProxyModel(this);
m_proxyModel->setSourceModel(m_model);
ui->tableView->setModel(m_proxyModel);
// 设置表头
QStringList headers;
headers << "姓名" << "性别" << "成绩";
m_model->setHorizontalHeaderLabels(headers);
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
// 读取CSV文件并填充模型
// ...
}
接下来,实现onFilterChanged槽函数和onTableDataChanged槽函数:
void MainWindow::onFilterChanged(const QString &text)
{
m_proxyModel->setFilterRegExp(QRegExp(text, Qt::CaseInsensitive)); // 设置过滤正则表达式
}
void MainWindow::onTableDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)
{
for (int row = topLeft.row(); row <= bottomRight.row(); ++row) {
QModelIndex index = m_proxyModel->mapToSource(m_proxyModel->index(row, 0));
if (index.isValid()) {
m_model->setData(index, m_proxyModel->data(index), Qt::EditRole); // 把修改同步到原始模型中
}
}
}
在onFilterChanged槽函数中,我们设置了QSortFilterProxyModel的过滤正则表达式,以根据用户输入的字符串对数据进行过滤。
在onTableDataChanged槽函数中,我们通过循环遍历代理模型中修改的数据,并使用QSortFilterProxyModel的mapToSource()函数将其映射回原始模型,然后使用setData()函数把修改同步到原始模型中。
最后,在MainWindow的构造函数中连接信号和槽:
connect(ui->lineEdit_filter, &QLineEdit::textChanged, this, &MainWindow::onFilterChanged);
connect(m_model, &QStandardItemModel::dataChanged, this, &MainWindow::onTableDataChanged);
这样,当用户在QLineEdit中输入字符串时,数据会被过滤,并显示在QTableView中。如果用户修改了数据,改动也会同步到原始模型中。