Шаг 120.
Библиотека Qt.
Дата и время

    На этом шаге рассмотрим переопределение специализированных методов обработки событий.

    Приложениям часто требуется информация о дате и времени, например, для выдачи отчетной информации или для реализации часов. Qt предоставляет для работы с датой и временем три класса: QDate, QTime и QDateTime, определенных в заголовочных файлах QDate, QTime и QDateTime.

    Класс QDate представляет собой структуру данных для хранения дат и проведения с ними разного рода операций. В конструктор класса QDate передаются три целочисленных параметра. Первым передается год, вторым — месяц, а третьим — день. Например, создадим объект, который будет содержать дату 8 марта 2015 года:

QDate date(2015, 3, 8);

    Эти значения с помощью метода setDate() можно установить и после создания объекта. Например:

QDate date;
date.setDate(2015, 3, 8);

    Для получения значений года, месяца и дня, установленных в объекте даты, следует воспользоваться следующими методами:

    С помощью метода daysInMonth() можно узнать количество дней в месяце, а с помощью метода daysInYear() — количество дней в году.

    Для получения дня недели следует вызвать метод dayOfWeek(). Для получения порядкового номера дня в году служит метод dayOfYear(). Можно также узнать номер недели, для чего нужно вызвать метод weekNumber().

    Метод toString() позволяет получить текстовое представление даты, а в качестве параметра можно передать одно из значений, указанных в табл. 1.

Таблица 1. Перечисления DateFormat пространства имен Qt
Константа
Значение
Описание
TextDate
0x0000
Специальный формат Qt (определен по умолчанию)
ISODate
0x0001
Расширенный формат ISO 8601 (YYYY-MM-DD)
SystemLocaleDate
0x0002
Формат, зависящий от установленного в операционной систе-ме языка страны
LocaleDate
0x0003
Формат, использующий локализацию приложения, которая устанавливается вызовом метода QLocale::setDefault(). Если он не установлен, то используется формат SystemLocaleDate

    Если в таблице не приведен нужный вам формат, то можно определить свой собственный, передав в метод toString() строку-шаблон, описывающую его. Например:

QDate date(2015, 3, 8);
QString str;
str = date.toString("d.M.yy"); //str = "8.3.15"
str = date.toString("dd/MM/yy"); //str = "08/03/15"
str = date.toString("yyyy.MMM.ddd"); //str = "2015.мар.Вс"
str = date.toString("yyyy.MMMM.dddd");//str = "2015.Март.воскресенье"

    Результат работы приложения приведен на рис. 1.


Рис.1. Примеры отображения даты

    Файлы приложения можно взять здесь.

    При помощи метода addDays() можно получить измененную дату, добавив или отняв от нее указанное количество дней. Действия методов addMonths() и addYears() аналогичны, но разница в том, что они оперируют месяцами и годами. Например:

QDate date(2015, 3, 8);
QDate date2 = date.addDays(-15);
QString str = date2.toString("dd/MM/yy");  //str = "21/02/15"  

    Результат работы приложения приведен на рис. 2.


Рис.2. Пример изменения даты

    Файлы приложения можно взять здесь.

    Класс QDate предоставляет статический метод fromString(), позволяющий проводить обратное преобразование из строкового типа к типу QDate. Для этого первым параметром метода нужно передать строку с датой, а вторым можно передать формат в виде флага из табл. 1 или строки.

    Одна из самых частых операций — получение текущей даты. Для этого нужно вызвать статический метод currentDate(), возвращающий объект класса QDate.

    При помощи метода daysTo() можно узнать разницу в днях между двумя датами. Следующий пример определяет количество дней от текущей даты до Нового года:

QDate dateToday = QDate::currentDate();
QDate dateNewYear(dateToday.year(), 12, 31);
qDebug() << "Осталось "
<< dateToday.daysTo(dateNewYear)
<< " дней до Нового года";

    Результат работы приложения приведен на рис. 3.


Рис.3. Пример расчета

    Файлы приложения можно взять здесь.

    Объекты дат можно сравнивать друг с другом, для чего в классе QDate определены операторы ==, !=, <, <=, > и >=. Например:

QDate date1(2015, 1, 3);
QDate date2(2015, 1, 5);
bool b = (date1 == date2); //b = false

    Результат работы приложения приведен на рис. 4.


Рис.4. Пример сравнения

    Файлы приложения можно взять здесь.

    Контроль над временем очень важная задача, с помощью которой можно вычислять задержки в работе программы, отображать на экране текущее время, проверять время создания файлов и т. д.

    Для работы со временем библиотека Qt предоставляет класс QTime. Как и в случае с объектами даты, с объектами времени можно проводить операции сравнения ==, !=, <, <=, > или >=.

    Объекты времени способны хранить время с точностью до миллисекунд. В конструктор класса QTime передаются четыре параметра. Первый параметр задает часы, второй — минуты, третий — секунды, а четвертый — миллисекунды. Третий и четвертый параметры можно опустить, по умолчанию они равны нулю. Например:

QTime time(20, 4);

    Эти значения можно устанавливать и после создания объекта времени посредством метода setHMS(). Например:

QTime time;
time.setHMS (20, 4, 23, 3); 

    Для получения значений часов, минут, секунд и миллисекунд, установленных в объекте времени, в классе QTime определены следующие методы:

    Класс QTime предоставляет метод toString() для передачи данных объекта времени в виде строки. В этот метод, в качестве параметра, можно передать одно из значений, указанных в табл. 1, или задать свой собственный формат. Например:

QTime time(20, 4, 23, 3);
QString str;
str = time.toString("hh:mm:ss.zzz"); //str = "20:04:23.003"
str = time.toString("h:m:s ap"); //str = "8:4:23 pm"  

    Результат работы приложения приведен на рис. 5.


Рис.5. Пример отображения времени

    Файлы приложения можно взять здесь.

    При помощи статического метода fromString() можно выполнить преобразование из строкового типа в тип QTime. Для этого первым параметром метода передается строка, представляющая время. Вторым параметром можно передать одно из значений форматов, приведенных в табл. 1, или строку с ожидаемым форматом.

    Изменить объект времени можно, добавив или отняв значения секунд (или миллисекунд) от существующего объекта. Эти значения передаются в методы addSecs() и addMSecs(). Для получения текущего времени в классе QTime содержится статический метод currentTime().

    При помощи метода start() можно начать отсчет времени, а для того чтобы узнать, сколько времени прошло с момента начала отсчета, следует вызвать метод elapsed(). Например, на базе этих методов можно сделать небольшой профайлер, т. е. инструмент, позволяющий оценить эффективность работы кода и выявить его узкие места для оптимизации. Следующий пример вычисляет время работы функции test():

QTime time;
time.start();
test();
qDebug() << "Время работы функции test() равно "
 << time.elapsed()
 << " миллисекунд"
 << endl;

    Недостаток класса QTime состоит в ограничении 24-часовым интервалом, по истечении которого отсчет будет осуществляться с нуля. Для решения этой проблемы можно воспользоваться классом QDateTime.

    Объекты класса QDateTime содержат в себе дату и время. Вызовом метода date() можно получить объект даты (QDate), а вызов time() возвращает объект времени (QTime). Этот класс также содержит методы toString() для представления данных в виде строки. Для этого можно воспользоваться одним из форматов, указанных в табл. 1, или собственной строкой с форматом.

    На следующем шаге рассмотрим события перетаскивания.




Предыдущий шаг Содержание Следующий шаг