参考链接:链接
主界面Widget.cpp:
void Widget::init()
{
QStringList tableHeaderList;
tableHeaderList << tr("num") << tr("name") << tr("class");
tblWgt->setRowCount(2);
tblWgt->setColumnCount(tableHeaderList.size());
tblWgt->horizontalHeader()->setStretchLastSection(true);
tblWgt->setItem(0, 0, new QTableWidgetItem("text00"));
tblWgt->item(0, 0)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
tblWgt->item(0, 0)->setFlags(tblWgt->item(0, 0)->flags() & (~Qt::ItemIsEditable));
tblWgt->setItem(0, 1, new QTableWidgetItem("text01"));
tblWgt->item(0, 1)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
tblWgt->item(0, 1)->setFlags(tblWgt->item(0, 1)->flags() & (~Qt::ItemIsEditable));
tblWgt->setItem(1, 0, new QTableWidgetItem("text10"));
tblWgt->item(1, 0)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
tblWgt->item(1, 0)->setFlags(tblWgt->item(1, 0)->flags() & (~Qt::ItemIsEditable));
tblWgt->setItem(1, 1, new QTableWidgetItem("text11"));
tblWgt->item(1, 1)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
tblWgt->item(1, 1)->setFlags(tblWgt->item(1, 1)->flags() & (~Qt::ItemIsEditable));
MyItemDelegate *ComDelegate = new MyItemDelegate;
tblWgt->setItemDelegateForColumn(2, ComDelegate); //设置表格的第三列为自定义代理
}
MyItemDelegate.h:
class MyItemDelegate : public QItemDelegate
{
Q_OBJECT
public:
MyItemDelegate(QObject *parent=Q_NULLPTR);
~MyItemDelegate();
protected:
virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
// 设置控件显示的数据
virtual void setEditorData(QWidget *editor, const QModelIndex &index) const override;
//对数据的改变更新到Model中
virtual void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override;
//完成控件的大小
virtual void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
};
MyItemDelegate.cpp:
MyItemDelegate::MyItemDelegate(QObject *parent)
: QItemDelegate(parent)
{
}
MyItemDelegate::~MyItemDelegate()
{
}
QWidget *MyItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
Q_UNUSED(option);
Q_UNUSED(index);
QComboBox *editor = new QComboBox(parent);
QStringList list;
list << "111";
list << "222";
list << "333";
list << "444";
list << "555";
editor->addItems(list);
return editor;
}
void MyItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
QString str = index.model()->data(index).toString();
QComboBox *box = static_cast<QComboBox*>(editor);
int i = box->findText(str);
box->setCurrentIndex(i);
}
void MyItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
QComboBox *box = static_cast<QComboBox*>(editor);
QString str = box->currentText();
model->setData(index, str);
}
void MyItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
Q_UNUSED(index);
editor->setGeometry(option.rect);
}
此时表格第三列的每一格,双击后都会显示QComboBox,再点击后出现下拉选项