qt中表格的数据默认是无法编辑的,当在model的flag()函数中设置其可编辑后,双击数据可以通过lineEdit(qt默认的编辑器是一个有边框的lineEdit)对数据进行编辑,但有时我们希望数据可以通过用下拉框来选择或者其他的编辑器来编辑数据,或者我们希望通过鼠标点击此数据来触发某个事件达到修改数据的目的或者其他的什么目的。这时就要用到委托QstyleItemDelegate。
qt默认的编辑器的效果:
如果我们想要达到下拉框的效果:
必须要重写三个函数:
1.QWidget*createEditor() 告诉model用的是那个编辑器进行数据的编辑和选择
2.voidsetEditorData() 从model中读取数据,设置编辑器显示的数据
3.voidsetModelData( ) 从编辑器中读取当前显示的数据,设置model中的数据源
代码如下:
#include <QStyledItemDelegate>
class QModelIndex;
class QPainter;
class QStyleOptionViewItem;
class ItemDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
explicit ItemDelegate(QObject *parent=0)
: QStyledItemDelegate(parent) {}
QWidget *createEditor(QWidget *parent,
const QStyleOptionViewItem &option,
const QModelIndex &index) const;
void setEditorData(QWidget *editor,
const QModelIndex &index) const;
void setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const;
};
对应的.cpp 文件中:
QWidget *ItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { static QStringList usStates; if (usStates.isEmpty()) usStates << "(Unknown)" << "Alabama" << "Alaska" << "Arizona" << "Arkansas" << "California" << "Colorado" << "Connecticut" << "Delaware" << "District Of Columbia" << "Florida" << "Georgia"; QComboBox *editor = new QComboBox(parent); //设置好对应的编辑器,添加好其中的内容及其大小的边界限制等 editor->addItems(usStates); return editor; }
void ItemDelegate::setEditorData(QWidget *editor,
const QModelIndex &index) const
{
//获取m