一杯清酒邀明月
天下本无事,庸人扰之而烦耳。

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

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

方案:Delegate

 1 class EditDelegate : public QStyledItemDelegate
 2 {
 3 public:
 4     EditDelegate(QTableView *view)
 5         : tableView(view)
 6     {}
 7 
 8 public:
 9     QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &) const override
10     {
11         // 这里你可以根据需要返回一个编辑控件,例如QLineEdit或QComboBox等。
12         QLineEdit *editor = new QLineEdit(parent);
13         return editor;
14     }
15 
16 protected:
17     void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override
18     {
19         QLineEdit *lineEdit = static_cast<QLineEdit *>(editor);
20         QString value = lineEdit->text();
21 
22         // 获取合并的行、列
23         int rowSpan = tableView->rowSpan(index.row(), index.column());
24         int columnSpan = tableView->columnSpan(index.row(), index.column());
25 
26         // 通过合并的行:修改ModelIndex的行索引,将修改的值给到所有的合并范围的单元格中
27         if (rowSpan > 1)
28         {
29             for (int i = 1; i <= rowSpan; i++)
30             {
31                 QVariant data = model->data(index, Qt::EditRole);
32                 QModelIndex mIndex = model->index(index.row() + i - 1, index.column());
33                 model->setData(mIndex, value, Qt::EditRole);
34             }
35         }
36         else
37         {
38             // 编辑普通单元格
39             tableView->edit(index);
40         }
41     }
42 
43 private:
44     QTableView *tableView;
45 };

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

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

 

posted on 2024-02-19 13:34  一杯清酒邀明月  阅读(84)  评论(0编辑  收藏  举报