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

同系列文章

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 运行效果

在这里插入图片描述

源码

源码

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Qt中,QTableView是一种用于显示表格数据的件,而QAbstractTableModel是QTableView使用的一种数据模型。如果想要在QTableView中展示自定义的数据,需要自定义一个继承自QAbstractTableModel的数据模型。 自定义QAbstractTableModel需要实现以下几个方法: 1. rowCount():返回数据模型中的行数。 2. columnCount():返回数据模型中的列数。 3. data():返回某一项的数据,可以用来在QTableView中展示数据。 4. setData():设置某一项的数据,可以用来在QTableView中编辑数据。 5. headerData():返回行或列的标签,可以用来在QTableView中显示表头。 6. flags():返回某一项的标志,用来指定该项是否可编辑、是否可选中等。 自定义QAbstractTableModel类后,可以将其与QTableView关联,通过setModel()方法来设置数据模型,使QTableView显示自定义的数据。 下面是一个简单的自定义QAbstractTableModel的例子: ```c++ class MyTableModel : public QAbstractTableModel { public: MyTableModel(QObject *parent = nullptr); int rowCount(const QModelIndex &parent = QModelIndex()) const override; int columnCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; Qt::ItemFlags flags(const QModelIndex &index) const override; private: QList<QList<QVariant>> m_data; }; ``` 在这个例子中,自定义的数据模型类为MyTableModel,其中实现了rowCount()、columnCount()、data()、setData()、headerData()和flags()方法。m_data变量用于存储数据。自定义的数据模型类可以在需要使用表格数据的地方创建,并通过setModel()方法将其与QTableView关联起来。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m晴朗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值