【发布时间】:2017-03-22 12:55:12
【问题描述】:
我正在使用QTableView 通过模型显示数据库表。其中一个表列有一个时间戳,实际上之前存储了一个 QDateTime。
有没有办法在演示时格式化时间戳值?我在想QDateTime("yyyy-MM-dd hh:mm:ss.zzz") 的 .toString 之类的东西。
【问题讨论】:
-
您使用的是哪种型号?
我正在使用QTableView 通过模型显示数据库表。其中一个表列有一个时间戳,实际上之前存储了一个 QDateTime。
有没有办法在演示时格式化时间戳值?我在想QDateTime("yyyy-MM-dd hh:mm:ss.zzz") 的 .toString 之类的东西。
【问题讨论】:
可以在QAbstractItemModel 的this 虚拟方法中返回您希望格式化的日期:
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 格式详细信息为here
【讨论】:
QDateTimes...
有一个函数,可以返回你想要的日期格式。
您可以根据您所需的格式,使用以下链接中的“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);
}
}
【讨论】: