更改QDate显示日期格式的方式

时间:2012-11-30 20:08:58

标签: qt qdate

我的应用程序有一个QTreeWidget,它在其中一列中使用QDate。由于列接受QVariants,它们几乎可以容纳任何类型的数据。我发现TreeWidget必须使用实际的QDate对象而不是QStrings才能使列排序功能正常工作。如果我使用QStrings作为日期,它们将不按正确的时间顺序排序,而是按字符串的数值排序。 (这是错误的!)我的程序支持多种日期格式:美国风格,欧洲风格和ISO-8601风格。我想在整个应用程序中保持一致,具体取决于用户选择的日期格式。

但是,我注意到QDate只显示MM / DD / YYYY格式的日期。还有一个奇怪的错误,QDate在Windows上显示MM / DD / YYYY,但完全相同的代码在Linux上显示MM / DD / YY。如何让QDate以YYYY / MM / DD或DD / MM / YYYY格式显示日期 不用 转换为QString?将所有内容保存为QDate格式是 必需 所以我不会破坏QTreeWidget中的列排序功能。

这是我将QString转换为QDate的代码:( nextitem 是QStringList)

// Convert QString date to QDate to make it sort correctly
                QDate entrydate;
                QString id=nextitem.at(2);

                id=id.remove("/");


                QString datepattern;

                switch(Buffer::date_format){
                case 0: // European
                    datepattern="ddMMyyyy";
                    break;

                case 1: // USA Style
                    datepattern="MMddyyyy";
                    break;

                case 2: // ISO
                    datepattern="yyyyMMdd";
                    break;
                }


                entrydate=QDate::fromString(id,datepattern);

2 个答案:

答案 0 :(得分:4)

QDate遵循操作系统中的当前设置。如果那个设置恰好是MM / DD / YY,那就是你得到的。注意:这是用户想要的。所有应用程序中的统一日期格式。

该设置还受操作系统中当前区域设置的影响。例如在美国,默认值为MM / DD / YY,而在大多数欧洲国家,默认值为DD / MM / YY。

换句话说:不要担心。这不是一个错误,这是一个功能。你不应该试图解决它。用户不希望他们的应用程序忽略他们的系统设置。如果我的系统设置为以MM / DD / YY显示日期,我当然不希望你的应用程序做自己的事情,而是以YYYY / MM / DD格式显示日期。

答案 1 :(得分:1)

您可以使用此代码:

QVariant var = item->data(i, Qt::DisplayRole);
if (var.type() == QVariant::DateTime)
{
    QDateTime dt = var.value<QDateTime>();
    QString value = dt.toString("yyyyMMdd");  // Or whatever format you need
}
else
    QString value = item->text(i);