1.头文件
#pragma once
#include
#include "ui_DelegateTest.h"
#include
#include
#include
class DataDelegate :public QItemDelegate
{
Q_OBJECT
public:
DataDelegate(QObject* parent = 0);
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; //将控件编辑的数据更新到model中
void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const; //更新控件位置
};
class DelegateTest : public QWidget
{
Q_OBJECT
public:
DelegateTest(QWidget *parent = Q_NULLPTR);
public slots:
void TestSlot();
private:
Ui::DelegateTestClass ui;
QTableView* m_tableView;
QStandardItemModel* m_model;
};
2.源文件
#include "DelegateTest.h"
#include
#include
#include
#include
DataDelegate::DataDelegate(QObject* parent) :
QItemDelegate(parent)
{
}
QWidget* DataDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
if (!index.isValid()) {
return nullptr;
}
if (index.column() == 0) {
QDateTimeEdit* editor = new QDateTimeEdit(parent);
editor->setDisplayFormat("yyyy-MM-dd");
editor->setCalendarPopup(true);
editor->installEventFilter(const_cast(this));
return editor;
} else if (index.column() == 1) {
QComboBox* editor = new QComboBox(parent);
QStringList strList;
strList<addItems(strList);
editor->installEventFilter(const_cast(this));
return editor;
} else if (index.column() == 2) {
QSpinBox* editor = new QSpinBox(parent);
editor->setRange(0, 100);
editor->installEventFilter(const_cast(this));
return editor;
}
return nullptr;
}
void DataDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const
{
if (!index.isValid() || editor == nullptr) {
return;
}
if (index.column() == 0) {
QString strData = index.model()->data(index).toString();
QDate date = QDate::fromString(strData, Qt::ISODate);
QDateTimeEdit* edit = static_cast(editor);
edit->setDate(date);
}
}
void DataDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const
{
if (!index.isValid()) {
return;
}
if (index.column() == 1) {
QComboBox* box = static_cast(editor);
model->setData(index, box->currentText());
}
}
void DataDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
editor->setGeometry(option.rect);
}
DelegateTest::DelegateTest(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
m_tableView = ui.tableView;
QStringList list;
list << QStringLiteral("语文") << QStringLiteral("数学") << QStringLiteral("英语") << QStringLiteral("历史");
m_model = new QStandardItemModel();
m_model->setHorizontalHeaderLabels(list);
m_model->setColumnCount(list.size());
m_tableView->setModel(m_model);
DataDelegate* dateDelegate = new DataDelegate;
m_tableView->setItemDelegate(dateDelegate);
connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(TestSlot()));
}
#include
#include
void DelegateTest::TestSlot()
{
QTime startTime = QTime::currentTime();
for (int i = 0; i < 1000; i++) {
m_model->setItem(i, 0, new QStandardItem("1"));
m_model->setItem(i, 1, new QStandardItem("2019-09-08"));
m_model->setItem(i, 2, new QStandardItem("2"));
m_model->setItem(i, 3, new QStandardItem("3"));
}
QTime stopTime = QTime::currentTime();
int elapsed = startTime.msecsTo(stopTime);
qDebug() << "QTime.currentTime =" << elapsed << "ms";
}
3.运行截图
image.png
image.png
image.png