1.数据模型:一般使用Qt的QAbstractItemModel作为基类,用于管理数据的存储和操作。它包括几个核心的函数:rowCount()、columnCount()、data()、setData()等。
2.视图:Qt中的视图主要有QTableView、QTreeView、QListView等,用于展示数据模型中的数据。
3.代理:代理用于在视图中修改数据的外观或行为,常用的代理有QItemDelegate、QStyledItemDelegate等。代理的主要函数有paint()、sizeHint()、createEditor()、setEditorData()、setModelData()等。
4.代理模型:代理模型是一种特殊的数据模型,它通过代理来修改数据的呈现方式,常用的代理模型有QSortFilterProxyModel、QIdentityProxyModel等。
5.委托模型:(QAbstractProxyModel)也是Qt中的一个模型类,它也用于在模型视图中进行数据转换和自定义呈现。与代理模型不同的是,委托模型可以对模型数据进行更复杂的转换和处理,例如将多个数据项合并为一个,或者将一个数据项拆分为多个。委托模型也可以用于在模型数据中添加虚拟行或列。
== 负有详细注释==
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
class CustomDelegate : public QStyledItemDelegate
{
public:
CustomDelegate(QObject *parent = nullptr)
: QStyledItemDelegate(parent)
{
}
// 重写paint()函数,实现自定义的绘制操作
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
{
// 获取单元格的值
QVariant value = index.model()->data(index, Qt::DisplayRole);
// 在单元格中绘制一个矩形和文本
painter->save();
painter->setRenderHint(QPainter::Antialiasing);
painter->setPen(QPen(Qt::black));
painter->setBrush(QBrush(Qt::white));
painter->drawRect(option.rect.adjusted(1, 1, -1, -1));
painter->drawText(option.rect, Qt::AlignCenter, value.toString());
painter->restore();
}
// 重写createEditor()函数,实现自定义的编辑器创建操作
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override
{
// 获取当前列的数据
QVariant data = index.model()->data(index, Qt::DisplayRole);
// 如果是“Age”列,则创建一个QComboBox对象作为编辑器,并设置其选项和默认值
if (index.column() == 1)
{
QComboBox *comboBox = new QComboBox(parent);
comboBox->addItems(QStringList() << "10" << "20" << "30" << "40");
return comboBox;
}
// 如果是“Gender”列,则创建一个QCheckBox对象作为编辑器,并设置其状态
else if (index.column() == 2)
{
QCheckBox *checkBox = new QCheckBox(parent);
checkBox->setChecked(data.toBool());
return checkBox;
}
// 否则,创建一个QLineEdit对象作为编辑器,并设置其文本
else
{
QLineEdit *lineEdit = new QLineEdit(parent);
lineEdit->setText(data.toString());
return lineEdit;
}
}
// 重写setEditorData()函数,实现自定义的编辑器数据设置操作
void setEditorData(QWidget *editor, const QModelIndex &index) const override
{
// 获取当前列的数据
QVariant data = index.model()->data(index, Qt::DisplayRole);
// 如果是“Age”列,则将当前项的文本设置为QComboBox的当前文本
if (index.column() == 1)
{
QComboBox *comboBox = qobject_cast(editor);
int currentIndex = comboBox->findText(data.toString());
comboBox->setCurrentIndex(currentIndex);
}
// 如果是“Gender”列,则将当前项的状态设置为QCheckBox的状态
else if (index.column() == 2)
{
QCheckBox *checkBox = qobject_cast(editor);
checkBox->setChecked(data.toBool());
}
// 否则,将当前项的文本设置为QLineEdit的文本
else
{
QLineEdit *lineEdit = qobject_cast(editor);
lineEdit->setText(data.toString());
}
}
// 重写setModelData()函数,实现自定义的编辑器数据提交操作
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override
{
// 获取编辑器中的数据
QVariant newData;
if (index.column() == 1)
{
QComboBox *comboBox = qobject_cast(editor);
newData = comboBox->currentText();
}
else if (index.column() == 2)
{
QCheckBox *checkBox = qobject_cast(editor);
newData = checkBox->isChecked();
if(newData.toBool()){
newData = "man";
}else {
newData = "woman";
}
}
else
{
QLineEdit *lineEdit = qobject_cast(editor);
newData = lineEdit->text();
}
// 将数据保存到模型中
model->setData(index, newData, Qt::EditRole);
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// 创建一个标准项模型,并设置其行数和列数
QStandardItemModel model;
model.setRowCount(4);
model.setColumnCount(3);
// 设置表头
model.setHeaderData(0, Qt::Horizontal, QString("Name"));
model.setHeaderData(1, Qt::Horizontal, QString("Age"));
model.setHeaderData(2, Qt::Horizontal, QString("Gender"));
// 向模型中添加数据
model.setData(model.index(0, 0), "Alice");
model.setData(model.index(1, 0), "Bob");
model.setData(model.index(2, 0), "Charlie");
model.setData(model.index(3, 0), "Dave");
model.setData(model.index(0, 1), "20");
model.setData(model.index(1, 1), "30");
model.setData(model.index(2, 1), "20");
model.setData(model.index(3, 1), "40");
model.setData(model.index(0, 2), "man");
model.setData(model.index(1, 2), "man");
model.setData(model.index(2, 2), "man");
model.setData(model.index(3, 2), "man");
// 创建一个TableView,并设置模型和委托
QTableView tableView;
tableView.setModel(&model);
CustomDelegate delegate;
tableView.setItemDelegate(&delegate);
// 允许编辑和排序
tableView.setEditTriggers(QAbstractItemView::AllEditTriggers | QAbstractItemView::EditKeyPressed);
tableView.setSortingEnabled(true);
// 设置表格大小
tableView.resize(400, 200);
// 显示TableView
tableView.show();
return app.exec();
}