格式化QTableView显示的日期/时间值

时间:2016-11-08 19:12:03

标签: c++ qt c++11 qt5 c++14

我使用QTableView通过模型显示数据库表。其中一个表列有一个时间戳,实际上之前存储了一个QDateTime。

有没有办法在演示时格式化时间戳值?我在考虑类似QDateTime("yyyy-MM-dd hh:mm:ss.zzz")的.toString。

2 个答案:

答案 0 :(得分:1)

可以在QAbstractItemModel的{​​{3}}虚拟方法中按照您的意愿返回日期格式:

QVariant QAbstractItemModel::data(const QModelIndex &item, int role = Qt::DisplayRole) const;

您必须从QSqlTableModel继承自己的模型并覆盖此方法。代码如下:

QVariant MySubclassedMode::data(const QModelIndex& item, int role = Qt::DisplayRole) const{

    if(role == Qt::DisplayRole && itemBelongsTodateTimeColumn(item)){

        QDateTime* dateTime = retrieveDateTimeObjectForModelIndex(item);
        return QVariant(dateTime.toString("d MMM YYYY, h:mm"));
    }

    return QSqlTableModel::data(item, role)
}

此方法可让您轻松更改对象在表格视图中的显示方式。

QDateTime格式详细信息为this

答案 1 :(得分:0)

有一个功能,它会返回你想要的日期格式。

根据您所需的格式,您可以使用“Qt :: DateFormat”来自下方链接的不同标志作为“tostring”的输入。

http://doc.qt.io/qt-5/qt.html#DateFormat-enum

功能是:

QString QDateTime::toString(Qt::DateFormat format = Qt::TextDate)

http://doc.qt.io/qt-5/qdatetime.html#toString-1

将QString附加到表格单元格。

如果您只想要时间:

“QDateTime”中有“time()”功能

QTime time() const

“QTime”也有“tostring”,您可以自定义所需的时间

QString QTime::toString(const QString &format) const

http://doc.qt.io/qt-5/qtime.html#toString

在添加到tableview之前更新模型中的Datetime: 这是我的猜测(代码是伪的。未经过测试且无法正常工作)

您可以使用信号“datachanged”来处理这种情况

http://doc.qt.io/qt-5/qabstractitemmodel.html#dataChanged

首先连接信号并定义一个插槽以在您的班级中处理它。

连接下面的datachanged信号是原型:

connect(ui->tableView->yourMODEL(),SIGNAL(dataChanged(QModelIndex,QModelIndex)),SLOT(UpdateData(QModelIndex,QModelIndex)));

在窗口中定义“UpdateData()”。

void YourWIndow::UpdateData(const QModelIndex & indexA, const QModelIndex & indexB)
{
    int columnValue = indexA.column();
    int rowValue = indexA.row();

    if("your Column value is QDATETIME column")
    {
        QSqlRecord record = ui->tableView->model()->record(rowValue);
        QVariant var = record (datefieldcolumn);
        QDateTime dTime = var.toDateTime();


        //Format it in your way.

        //Update your QSqlRecord.
        record.setValue(datefieldcolumn,QVariant(formatedDateTime));

        ui->tableView->model()->setRecord(rowValue,record);
    }
}