效果图:
实现:
1)继承代理类,实现自定义代理,网上很多教程,这里不再赘叙;
2)更加方便的方法,使用接口:
void QAbstractItemView::setIndexWidget(const QModelIndex &index, QWidget *widget)
其实QTableWidget的setCellWidget接口内部也是调用 setIndexWidget。
示例代码:
如下,注意 ui->tableView->setModel(model); 必须在model添加数据之前调用才有效
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)
{
ui->setupUi(this);
QStandardItemModel* model = new QStandardItemModel();
ui->tableView->setModel(model);
ui->tableView->setFocusPolicy(Qt::NoFocus); //去掉选中单元格时的虚框
model->setHorizontalHeaderLabels({"姓名", "年龄", "性别"});
model->setItem(0, 0, new QStandardItem("张三"));
model->setItem(0, 1, new QStandardItem("3"));
QComboBox* cmb = new QComboBox();
cmb->addItems({"男", "女"});
ui->tableView->setIndexWidget(model->index(0, 2), cmb);
model->setItem(1, 0, new QStandardItem("李四"));
model->setItem(1, 1, new QStandardItem("5"));
cmb = new QComboBox();
cmb->addItems({"男", "女"});
ui->tableView->setIndexWidget(model->index(1, 2), cmb);
}