Изменение способа отображения формата даты в QDate

Мое приложение имеет QTreeWidget, который принимает QDate в одном из своих столбцов. Поскольку столбцы принимают QVariants, они могут содержать практически любые данные. Я обнаружил, что TreeWidget должен использовать реальные объекты QDate вместо QStrings для корректной работы функции сортировки столбцов. Если я использую QStrings для дат, они будут отсортированы не в правильном хронологическом порядке, а по числовым значениям строк. (что не так!) Моя программа поддерживает несколько форматов даты: стиль США, европейский стиль и стиль ISO-8601. Я бы хотел, чтобы в приложении было все согласованно, в зависимости от того, какой формат даты выбрал пользователь.

Однако я заметил, что QDate отображает даты только в формате MM/DD/YYYY. Также есть странная ошибка, когда QDate отображает MM/DD/YYYY в Windows, но точно такой же код отображает MM / DD / YY в Linux. Как я могу получить QDate для отображения дат в формате ГГГГ / ММ / ДД или ДД / ММ / ГГГГ без преобразования в 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 ответа

Решение

QDate соответствует текущим настройкам операционной системы. Если этот параметр окажется MM/DD/YY, то это то, что вы получите. Примечание: это то, что хочет пользователь. Единый формат даты во всех приложениях.

На настройку также влияют текущие языковые настройки в ОС. Например, в США по умолчанию будет MM/DD/YY, в то время как в большинстве европейских стран это DD / MM / YY.

Другими словами: не беспокойтесь об этом. Это не ошибка, это особенность. И вы не должны пытаться обойти это. Пользователи не хотят, чтобы их приложения игнорировали системные настройки. Если моя система настроена на отображение дат в формате ММ / ДД / ГГ, я, разумеется, не хотел бы, чтобы ваше приложение выполняло свои функции и отображало даты в формате ГГГГ / ММ / ДД.

Вы можете использовать этот код:

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);
Другие вопросы по тегам