【QT】解决QTableView修改合并单元格内容无法修改到合并范围内的单元格

2023-12-20 06:40:26

问题:修改合并单元格的内容

修改合并单元格的内容时,希望直接修改到合并范围内的单元格,Qt没有实现这个功能,需要自己写出 Delegate来实现

方案:Delegate

class EditDelegate : public QStyledItemDelegate
{
public:
    EditDelegate(QTableView *view)
        : tableView(view)
    {}

public:
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &) const override
    {
        // 这里你可以根据需要返回一个编辑控件,例如QLineEdit或QComboBox等。
        QLineEdit *editor = new QLineEdit(parent);
        return editor;
    }

protected:
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override
    {
        QLineEdit *lineEdit = static_cast<QLineEdit *>(editor);
        QString value = lineEdit->text();

        // 获取合并的行、列
        int rowSpan = tableView->rowSpan(index.row(), index.column());
        int columnSpan = tableView->columnSpan(index.row(), index.column());

        // 通过合并的行:修改ModelIndex的行索引,将修改的值给到所有的合并范围的单元格中
        if (rowSpan > 1)
        {
            for (int i = 1; i <= rowSpan; i++)
            {
                QVariant data = model->data(index, Qt::EditRole);
                QModelIndex mIndex = model->index(index.row() + i - 1, index.column());
                model->setData(mIndex, value, Qt::EditRole);
            }
        }
        else
        {
            // 编辑普通单元格
            tableView->edit(index);
        }
    }

private:
    QTableView *tableView;
};

在使用的时候将Delegate设置对应的列或者行即可

tableView->setItemDelegateForColumn(1, new EditDelegate(tableView));

文章来源:https://blog.csdn.net/weixin_44404541/article/details/135077138
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。