LINUX.ORG.RU

Qt4 и firstDayOfWeek

 


0

1

Привет всем!

Сформировалась подзадача получить день, с которого начинается неделя. В некоторых странах это воскресение, в других, таких как Франция и Россия - понедельник.

В принципе, без проблем. В Qt 4.8 есть функция QLocale::firstDayOfWeek() const. Через нее все легко получается. Проблема в том, что нужно обеспечить совместимость с ранними версиями Qt4. Альтернативу нашел в boost. Функция int boost::locale::calendar::first_day_of_week() const.

Хотел узнать как поступали в этом случае ранние Qt'шники, до 4.8? Решение должно быть кроссплатформенным. Заранее спасибо!

★★★★★

Заглянуть в исходники 4.8 и backport в своё приложение?

UVV ★★★★★
()
Qt::DayOfWeek firstDayOfWeekFromLocale()
{
#if QT_VERSION >= QT_VERSION_CHECK(4, 8, 0)
return QLocale().firstDayOfWeek();
#else
Qt::DayOfWeek firstDay = Qt::Monday;
# ifdef Q_OS_WIN
WCHAR wsDay[4];
# if defined(_WIN32_WINNT_VISTA) && WINVER >= _WIN32_WINNT_VISTA && defined(LOCALE_NAME_USER_DEFAULT)
if (GetLocaleInfoEx(LOCALE_NAME_USER_DEFAULT, LOCALE_IFIRSTDAYOFWEEK, wsDay, 4)) {
# else
if (GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_IFIRSTDAYOFWEEK, wsDay, 4)) {
# endif
bool ok;
int wfd = QString::fromWCharArray(wsDay).toInt(&ok) + 1;
if (ok) {
firstDay = (Qt::DayOfWeek)(unsigned char)wfd;
}
}
# elif defined(__GLIBC__)
firstDay = (Qt::DayOfWeek)(unsigned char)((*nl_langinfo(_NL_TIME_FIRST_WEEKDAY) + 5) % 7 + 1);
# elif defined(Q_OS_MAC)
firstDay = (Qt::DayOfWeek)(unsigned char)macosCommonFirstWeekday();
# endif
return firstDay;
#endif
}

#include "cocoacommon.h" /* int macosCommonFirstWeekday(); */
#include <Cocoa/Cocoa.h>

int macosCommonFirstWeekday() {
int firstDay;
NSCalendar *cal = [NSCalendar currentCalendar];
firstDay = ([cal firstWeekday] + 5) % 7 + 1;
return firstDay;
}
bhfq ★★★★★
()
Последнее исправление: bhfq (всего исправлений: 2)

Хотел узнать как поступали в этом случае ранние Qt'шники, до 4.8? Решение должно быть кроссплатформенным.

А оно им надо было? Каждый делал сам.

bhfq ★★★★★
()

Есть, например, такой вариант:

#if QT_VERSION < 0x040800
#define CUSTOM_DAY_OF_WEEK

#include <langinfo.h>
#include <locale.h>

static Qt::DayOfWeek firstDayOfWeek(void)
{
    const char *const s = nl_langinfo(_NL_TIME_FIRST_WEEKDAY);
    if (s)
    {
        if (*s == 1)
            return Qt::Sunday;

         if (*s >= 2 && *s <= 7)
            return (Qt::DayOfWeek)(*s - 1);
    }

    return Qt::Monday;
}

#endif
#ifdef  CUSTOM_DAY_OF_WEEK
    firstDayOfWeek = firstDayOfWeek;
#else
    firstDayOfWeek = QLocale::system().firstDayOfWeek();
#endif
PatrickKilpatrick
()
Ответ на: комментарий от PatrickKilpatrick

Способ хороший, но под виндой, кажется, не работает.

hibou ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.