QTableWidget 使用多个组合的控件编辑单元格的C++代码
时间: 2024-01-22 10:20:03 浏览: 123
QTableWidget 可以使用自定义委托来实现在单元格中使用多个组合控件进行编辑。下面是一个简单的示例代码,其中使用了 QComboBox 和 QLineEdit 作为委托控件。
首先,我们需要创建一个自定义委托类 CustomDelegate,继承自 QItemDelegate:
```
class CustomDelegate : public QItemDelegate
{
public:
CustomDelegate(QObject *parent = nullptr);
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
void setEditorData(QWidget *editor, const QModelIndex &index) const override;
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override;
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
};
```
在 createEditor 方法中,我们可以根据单元格的数据类型创建不同的编辑控件。在这个例子中,我们只使用了两种控件,QComboBox 和 QLineEdit。
```
QWidget *CustomDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
// 获取单元格的数据类型
int type = index.data(Qt::UserRole).toInt();
// 创建编辑控件
if (type == 0) {
QComboBox *editor = new QComboBox(parent);
editor->addItem("Option 1");
editor->addItem("Option 2");
editor->addItem("Option 3");
return editor;
} else {
QLineEdit *editor = new QLineEdit(parent);
return editor;
}
}
```
在 setEditorData 方法中,我们需要将单元格的数据加载到编辑控件中。在这个例子中,我们使用了 QVariant 来存储单元格的数据类型和值。
```
void CustomDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
// 获取单元格的数据类型和值
int type = index.data(Qt::UserRole).toInt();
QVariant value = index.data(Qt::EditRole);
// 将数据加载到编辑控件中
if (type == 0) {
QComboBox *comboBox = static_cast<QComboBox*>(editor);
comboBox->setCurrentText(value.toString());
} else {
QLineEdit *lineEdit = static_cast<QLineEdit*>(editor);
lineEdit->setText(value.toString());
}
}
```
在 setModelData 方法中,我们需要将编辑控件中的数据保存到单元格中。在这个例子中,我们使用了 QVariant 来存储单元格的数据类型和值。
```
void CustomDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
// 获取单元格的数据类型
int type = index.data(Qt::UserRole).toInt();
// 将编辑控件中的数据保存到单元格中
if (type == 0) {
QComboBox *comboBox = static_cast<QComboBox*>(editor);
QString value = comboBox->currentText();
model->setData(index, QVariant::fromValue(QPair<int, QVariant>(type, value)), Qt::EditRole);
} else {
QLineEdit *lineEdit = static_cast<QLineEdit*>(editor);
QString value = lineEdit->text();
model->setData(index, QVariant::fromValue(QPair<int, QVariant>(type, value)), Qt::EditRole);
}
}
```
在 updateEditorGeometry 方法中,我们需要设置编辑控件的位置和大小。
```
void CustomDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
editor->setGeometry(option.rect);
}
```
最后,我们需要将自定义委托设置给 QTableWidget 的某一列,以便在编辑单元格时使用多个组合控件。
```
QTableWidget *tableWidget = new QTableWidget();
tableWidget->setRowCount(10);
tableWidget->setColumnCount(2);
// 将自定义委托设置给第二列
CustomDelegate *delegate = new CustomDelegate();
tableWidget->setItemDelegateForColumn(1, delegate);
```
以上就是使用多个组合控件编辑 QTableWidget 单元格的代码示例。
阅读全文