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

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

修改合并单元格的内容时,希望直接修改到合并范围内的单元格,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));

你可能感兴趣的:(小知识点,Qt项目实战,qt,开发语言)