QT开发中文网

C++ QtableView对过滤后的数据进行编辑,请用代码详细说明

以下是一个对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中。如果用户修改了数据,改动也会同步到原始模型中。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=1007

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?