Изменение способа отображения формата даты в 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);