同系列文章

​​QT中级(1)QTableView自定义委托(一)实现QSpinBox、QDoubleSpinBox委托​​QT中级(2)QTableView自定义委托(二)实现QProgressBar委托
QT中级(3)QTableView自定义委托(三)实现QCheckBox委托并且将QCheckBox居中
QT中级(4)QTableView自定义委托(四)实现QDateTimeEdit、QDateEdit控件
QT高级(1)QTableView自定义委托集合,一个类实现若干委托

1 思路

有了前面几篇文章的基础,我们的思路应该很清晰。

  1. 明白我们要做什么:我们要实现QDateTimeEdit、QDateEdit、QTimeEidt控件委托
  2. 为什么是三个控件一起:因为这三个控件极为相似,实现方式也是类似的
  3. 我们要怎么做:继承QStyledItemDelegate类,并实现以下四个函数
QWidget * createEditor(..)
void setEditorData(...)
void setModelData(...)
void updateEditorGeometry(...)

明白了我们的思路。我们接下来实现它。我们沿用的代码还是前面三篇相同的代码,大家可以看第一篇中是会如何创建代码的。

2 实现核心函数

  1. 创建编辑器
QWidget *Delegate::createEditor(QWidget *parent, const QStyleOptionViewItem &/*option*/, const QModelIndex &/*index*/) const
{
/*创建编辑器*/
QWidget *editor = new QWidget(parent);
if (delegateType == "QDateTimeEdit") {
QDateTimeEdit *dateTime = new QDateTimeEdit(parent);
dateTime->setCalendarPopup(true);
dateTime->setDisplayFormat("yyyy-MM-dd HH:mm:ss");
dateTime->calendarWidget()->setLocale(QLocale::Chinese);
editor = dateTime;
}
else if (delegateType == "QDateEdit") {
QDateEdit *date = new QDateEdit(parent);
date->setCalendarPopup(true);
date->setDisplayFormat("yyyy-MM-dd");
date->calendarWidget()->setLocale(QLocale::Chinese);
editor = date;
}
else if (delegateType == "QTimeEdit") {
QTimeEdit *time = new QTimeEdit(parent);
time->setDisplayFormat("HH:mm:ss");
editor = time;
}

return editor;
}
  1. 将模型中的数据赋值给编辑器
void Delegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
auto value = index.model()->data(index, Qt::EditRole);
if (delegateType == "QDateTimeEdit")
{
QDateTimeEdit *dateTime = static_cast<QDateTimeEdit *>(editor);
dateTime->setDateTime(QDateTime::fromString(value.toString(), "yyyy-MM-dd HH:mm:ss"));
}
else if (delegateType == "QDateEdit")
{
QDateEdit *date = static_cast<QDateEdit *>(editor);
date->setDate(QDate::fromString(value.toString(), "yyyy-MM-dd"));
}
else if (delegateType == "QTimeEdit")
{
QTimeEdit *time = static_cast<QTimeEdit *>(editor);
time->setTime(QTime::fromString(value.toString(), "HH:mm:ss"));
}
else
{
QStyledItemDelegate::setEditorData(editor, index);
}
}
  1. 将编辑器的值赋值给模型
void Delegate::setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const
{
QVariant value = model->data(index);
if (delegateType == "QDateTimeEdit")
{
QDateTimeEdit *dateTime = static_cast<QDateTimeEdit *>(editor);
value = dateTime->dateTime().toString("yyyy-MM-dd HH:mm:ss");
}
else if (delegateType == "QDateEdit")
{
QDateEdit *date = static_cast<QDateEdit *>(editor);
value = date->date().toString("yyyy-MM-dd");
}
else if (delegateType == "QTimeEdit")
{
QTimeEdit *time = static_cast<QTimeEdit *>(editor);
value = time->time().toString("HH:mm:ss");
}
model->setData(index, value, Qt::EditRole);

}
  1. 更新编辑器的位置和大小
void Delegate::updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option,
const QModelIndex &/* index */) const
{
editor->setGeometry(option.rect);
}

3 运行效果

QT中级(4)QTableView自定义委托(四)实现QDateTimeEdit、QDateEdit控件_qt