【问题标题】:Changing the way QDate displays date format更改 QDate 显示日期格式的方式
【发布时间】:2017-02-20 20:00:33
【问题描述】:

我的应用程序有一个 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);

【问题讨论】:

    标签: qt qdate


    【解决方案1】:

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

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

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

    【讨论】:

    • 啊,这解释了为什么我在 Linux 和 Windows 上得到不同的日期格式,即使应用程序的两个实例都配置为使用美国格式。应用程序使用的数据包括从数据库中提取的日期/时间,因此我的应用程序允许用户在必要时重新格式化日期。我想我应该在下一个版本中弃用该功能,让 QDate 在幕后处理它。
    【解决方案2】:

    您可以使用此代码:

    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-30
      • 1970-01-01
      • 2020-08-05
      • 1970-01-01
      • 2017-10-26
      • 1970-01-01
      • 1970-01-01
      • 2017-05-23
      相关资源
      最近更新 更多